概括
有没有办法在模板化类型上调用一个类方法,它可能是一个指针或一个引用,而不知道哪个并且不会得到编译器/链接器错误?
细节
我有一个模板化的 QuadTree 实现,它可以采用以下任何重要的用户定义类型:
//Abstract Base Class
a2de::Shape
//Derived Classes
a2de::Point
a2de::Line
a2de::Rectangle
a2de::Circle
a2de::Ellipse
a2de::Triangle
a2de::Arc
a2de::Spline
a2de::Sector
a2de::Polygon
但它们可以是指针或引用,因为它们都是从 a2de::Shape 派生的。因此,专业化声明为:
template class QuadTree<a2de::Shape&>;
//...similar for all derived types as references.
template class QuadTree<a2de::Shape*>;
//...similar for all derived types as pointers
我遇到的问题是当间接(或缺少间接)未知时调用类方法的能力,并且由于模板,生成了两组代码:
template<typename T>
bool QuadTree<T>::Add(T& elem) {
//When elem of type T is expecting a pointer here
//-> notation fails to compile where T is a reference i.e.:
//template class QuadTree<a2de::Shape&>
//with "pointer to reference is illegal"
if(elem->Intersects(_bounds) == false) return false;
//...
}
如果我将上面的行更改为使用 . (点)符号:
template<typename T>
bool QuadTree<T>::Add(T& elem) {
//When elem of type T is expecting a reference here
//. (dot) notation fails to compile where T is a pointer i.e.:
//template class QuadTree<a2de::Shape*>
//with "pointer to reference is illegal"
if(elem.Intersects(_bounds) == false) return false;
//...
}
如果我删除基于引用的类型以支持基于指针的类型(包括在 Quadtree 类的声明和使用中),我会收到错误消息left of .<function-name> must have class/struct/union
。
如果我删除基于指针的类型以支持基于引用的类型(包括在 Quadtree 类的声明和使用中),我会再次得到上述内容reference to pointer is illegal
。
编译器:VS2010-SP1