2016-07-21 15 views
0

ich über den folgenden Code kam in der OpenVDB Dokumentation:Funktionsargument hat keine Art

template<typename _RootNodeType> 
class Tree: public TreeBase 
{ 
... 
    template<typename OtherTreeType> 
    Tree(const OtherTreeType& other, 
     const ValueType& inactiveValue, 
     const ValueType& activeValue, 
     TopologyCopy): // <-- this looks weird 
     TreeBase(other), 
     mRoot(other.root(), inactiveValue, activeValue, TopologyCopy()) 
    { 
} 

ich bisher gesehen habe, dass ein Argument defaults to an int wenn kein Typ angegeben ist, könnte aber dies hier der Fall sein? TopologyCopy wird als Operator 2 Zeilen unten genannt.

Was bedeutet die obige Deklaration?

Bearbeiten: Die angenommene Antwort erklärt, was passiert. Die Lösung ist, die Funktion als

openvdb::Tree newTree(oldTree, inactiveValue, activeValue, TopologyCopy()); 
+0

Sieht komisch aus, weil es seltsam ist. Warum sollte jemand ein Argument nehmen, es nicht benutzen und den gleichen Typ konstruieren? Ich hoffe, irgendwo gibt es einen Kommentar, warum oder warum ein Argument notwendig ist, um es von einer anderen Version des Konstruktors zu unterscheiden. –

Antwort

2

Es ist kein Argument ohne einen Typ. Es ist ein Argument ohne Namen. Sein Typ ist TopologyCopy. Und TopologyCopy() ist standardmäßig erstellen ein Objekt dieses Typs und übergibt es an den Konstruktor mRoot. Wenn ich raten müsste, würde ich sagen, dass sie wahrscheinlich Tag-Dispatching verwenden, um zwischen verschiedenen Konstruktoren mit ansonsten identischen Argumenten zu wählen.

+0

Hmm, das macht Sinn. Weißt du, wie ich diesen Konstruktor aufrufen würde? Die Verwendung von nur 3 Argumenten führt zu einem Compilerfehler. – pingul

+2

@pingul: Übergeben Sie 'TopologyCopy()' als viertes Argument, genau wie für 'mRoot'. –

0

TopologyCopy ist eine Art zu nennen, und als Argument/Variable nicht verwendet wird, ist es nicht vorhanden.

Nach TopologyCopy() konstruiert ein TopologyCopy.

+0

Sie können einen Konstruktor nicht wirklich als Benutzer aufrufen, da Konstruktoren keinen Namen haben. Und stellen Sie sich vor 'mit TopologyCopy = int;' –