Специализация шаблонов C ++, вызов методов на типах, которые могут быть однозначными указателями или ссылками

Резюме

Есть ли способ вызвать метод класса для шаблонного типа, который может быть указателем или ссылкой, не зная, что и не получить ошибки компилятора / компоновщика?

подробности

У меня есть шаблонная реализация 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;
//...similar for all derived types as references.

template class QuadTree;
//...similar for all derived types as pointers

Проблема, с которой я сталкиваюсь, заключается в возможности вызова метода класса, когда косвенность (или ее отсутствие) неизвестна, и из-за шаблонов генерируются оба набора кода:

template
bool QuadTree::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
    //with "pointer to reference is illegal"

    if(elem->Intersects(_bounds) == false) return false;

    //...
}

Если я изменю вышеприведенную строку, чтобы использовать. (точка) обозначение:

template
bool QuadTree::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
    //with "pointer to reference is illegal"

    if(elem.Intersects(_bounds) == false) return false;

    //...

}

Если я удаляю ссылочные типы в пользу основанных на указателе типов (в том числе в объявлении и использовании класса Quadtree), я получаю ошибку.left of . must have class/struct/union

Если я удаляю основанный на указателе тип в пользу ссылочных типов (в том числе в объявлении и использовании класса Quadtree), я получаю вышеупомянутоеreference to pointer is illegal снова.

Компилятор: VS2010-SP1

Ответы на вопрос(1)

Ваш ответ на вопрос