Резюме
Есть ли способ вызвать метод класса на шаблонном типе, который может быть указателем или ссылкой, не зная, какие и не получить ошибки компилятора/компоновщика?
Подробнее
У меня есть шаблонная реализация 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