2016-04-18 3 views
0

Ich bin eine Boundary Volumn Hierarchiestruktur Implementierung, wo der Baum eine Vorlage wie folgt hat:C++ wie mit Template-Spezialisierung oder andere Weise zu implementieren?

template <typename Coordinate> 
class BoundingTree { /* ... */ } 

Die Coordinate kann Vector2d, Vector3f oder jede andere beliebige Koordinate. Um diese BoundingTree Struktur zur Kollisionserkennung zu verwenden, sollte es eine Erkennungsfunktion sein:

template <typename Coordinate> 
template <typename RigidBody> 
bool BoundingTree::collide(RigidBody const & body); 

Die RigidBody kann alles sein, z.B. Cuboid3f, Circle2d. Und meine Umsetzung dieses Detektionssystem ist:

// BoundingTree.h 
template <typename Coordinate> 
class BoundingTree 
{ 
public: 
    BoundingTree() {} 

    // collide function decleration 
    template <typename RigidBody> 
    bool collide(RigidBody const & obj); 

}; 

// BoundingTree.cpp 
// specilizations 
template<typename Coordinate> template <typename RigidBody> 
bool BoundingTree::collide(RigidBody const & obj) 
{ 
    std::cout << "default" << std::endl; 
    return false; 
} 

template<> template<> 
bool BoundingTree<Vector3f>::collide<Sphere3f>(Sphere3f const & d) 
{ 
    std::cout << "Vector3f Sphere3f" << std::endl; 
    return 1; 
}; 

template<> template<> 
bool BoundingTree<Vector3f>::collide<Cuboid3f>(Cuboid3f const & d) 
{ 
    std::cout << "Vector3f Cuboid3f" << std::endl; 
    return 1; 
}; 

Aber ich habe einen Fehler gefunden:

1>BoundingTree.cpp(6): error C2955: 'BoundingTree': use of class template requires template argument list 
1> BoundingTree.h(32): note: see declaration of 'BoundingTree' 
1>BoundingTree.cpp(10): error C2244: 'BoundingTree::collide': unable to match function definition to an existing declaration 
1> BoundingTree.cpp(6): note: see declaration of 'BoundingTree::collide' 

Wie dieses Problem zu lösen?

Gibt es eine bessere Möglichkeit, dieses Kollisionserkennungssystem mit beliebigen Typen zu implementieren?

Vielen Dank.

+0

Wo ist Zeile 6 von BoundingTree.cpp in Ihrem Beitrag? 'BoundingTree :: kollidieren 'hat zwei' template 'Klauseln davor. Das ist syntaktisch falsch. – Drop

+0

Abgesehen von dem Syntaxproblem können Sie Vorlagen im Allgemeinen nicht in Kopf- und Quelldateien aufteilen. Siehe: [Warum können Vorlagen nur in der Header-Datei implementiert werden?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implementiert-in-the-header-file?rq= 1) – Drop

Antwort

1

Was Sie versuchen, is allowed zu tun, aber Sie haben einen Syntaxfehler, die hier ist:

template<typename Coordinate> template <typename RigidBody> 
bool BoundingTree::collide(RigidBody const & obj) 
         ^

Dies ist nicht eine Spezialisierung, so dass Sie das Template-Argument für die Klasse angeben muss, sollte es sein

bool BoundingTree::collide<Coordinate>(...) 

Aber ich sehe, dass Ihr Code in Header und Quelle aufgeteilt ist, kann dies Problem mit nicht Spezialisierung Ihres Codes erstellen.

Wenn eine Template-Funktion in einer Quelldatei definiert ist, aber in einer anderen Übersetzungseinheit verwendet wird, werden die Instanziierungen der Vorlage beim Kompilieren nicht generiert, und Sie erhalten Linker-Fehler.

Das mit voller Spezialisierungen nicht passieren wird, wie

template<> template<> 
bool BoundingTree<Vector3f>::collide<Sphere3f>(Sphere3f const & d) 

Aber wenn Sie teilweise Spezialisierungen haben wollen, dann werden Sie gezwungen, alles in der Header-Datei zu verschieben oder die Instanziierung der Vorlage in der Kraft Quelldatei, die sie definiert, zB

template class BoundingTree<MyCoord>; 
template bool BoundingTree<MyCoord>::collide<MyShape>(MyShape const& d); 
+0

Ich glaube, die richtige Syntax ist eigentlich: "Vorlage Vorlage bool BoundingTree :: kollidieren (RigidBody Const & Obj)", zumindest nach gcc 5.3.1 –

+0

@SamVarshavchik: On clang 3.4 Das kompiliert und führt korrekt aus, aber ich bin zu müde, um den Standard jetzt zu öffnen. – Jack

+0

@Jack mit all diesen in einer Header-Datei, habe ich einen Fehler von einem oder mehreren mehrfach definierten Symbolen gefunden, wenn mehrere enthalten. Habe ich es falsch gemacht? – stanleyerror

Verwandte Themen