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.
Wo ist Zeile 6 von BoundingTree.cpp in Ihrem Beitrag? 'BoundingTree :: kollidieren 'hat zwei' template 'Klauseln davor. Das ist syntaktisch falsch. –
Drop
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