2015-06-27 2 views
0

Я работаю над набором классов шаблонов, которые представляют различные биты геометрии, и я понял, что хотел бы специализировать различные классы для обработки ссылок и указателей, например.Неопределенная ссылка на метод частично специализированного класса

template<typename T> 
class rect{ // as in rectangle 
public: 
    point<T> point1, point2; // Point simply contains two instances of type T 
    ... // Twenty functions or so follow 
}; 

template<typename T> 
class rect<point<T>>{ // trying to put a point in a point makes no sense anyway 
public:    // so I see this technique as valid 
    point<T>& point1,& point2; 
    ... // I really don't want to redefine them if I don't have to 
}; 

Проблемы начинаются с моей тестовой программы

#include <iostream> 
#include <TGeometry.hpp> 

template<typename T> 
class test{ 
public: 
    T A; 

    void myfunc(){std::cout << "from base\n";} 
    void otherfunc(T O); 
    test(const T nA) : A(nA) {} 
    test(){} 
}; 

template<typename T> 
void test<T>::otherfunc(T O){A += O;} 

template<typename T> 
class test<T&>{ 
public: 
    T& A; 

    void myfunc(){std::cout << "from refr\n";} 
    void otherfunc(T O); // Shouldn't this default to using test<T>::otherfunc? 
    test(T& nA) : A(nA) {} 
}; 


int main(){ using std::cout; 
    using namespace d2; 

    test<int> Atest(5); 
    test<int&> Btest(Atest.A); 

    Atest.myfunc(), Btest.myfunc(); 
    Btest.otherfunc(Atest.A); // test<T&>::otherfunc undefined? 
    Atest.otherfunc(10); 

    std::cin.ignore(); 
    return 0; 
} 

Эта программа составлена ​​в Mingw_w64, выходит с

C:\Users\*>g++ -o test.exe quicktest.cpp -I .\Libraries 
C:\Users\THEMAG~1\AppData\Local\Temp\ccszH6xM.o:quicktest.cpp:(.text+0x42):undefined reference to `A<char, 2>::f()' 
collect2.exe: error: ld returned 1 exit status 

Это может быть просто отсутствие знаний о моей стороны, но this веб-сайт (внизу, первый пример под частичными специализациями) подразумевает, что вы можете исключить определение функции для частичной специализации, пока yo u объявили его, и он по умолчанию будет использовать определение основного шаблона.

Будучи в состоянии сделать это, я сэкономил бы дни работы, так как мне не пришлось бы переопределять все функции моего класса. Поэтому мой вопрос заключается в том, что сводит мой код с компиляцией и может/как я могу специализировать свои классы для ссылок (мне все равно нужно сделать это для указателей) без необходимости переопределять их функции? Является ли это просто проблемой ссылок, изменяющих способ работы кода, например. функция первичной специализации просто сместила бы ссылку, если бы она использовалась.

+0

Сообщение об ошибке не может быть связано с кодом, который вы показываете. В коде не упоминается шаблон с именем 'A', а также функция-член с именем' f'. –

+0

Может быть полезно, если вы отправили ошибку компоновщика, которую генерирует ваш код, поскольку в приведенном вами примере кода нет ссылки на 'f()'. – kfsone

+0

Согласно идее (http://ideone.com/JZemgY), ошибка в вашем MVCE является 'undefined reference to 'test :: otherfunc (int)''? – kfsone

ответ

0

Я не думаю, что это понятие, в котором специализированные шаблоны классов наследуют реализации методов из неспециализированного шаблона класса, верны. Рассмотрим, например, std :: enable_if. Вся цель этого класса заключается в том, чтобы вызвать отказ подзадачи путем ссылки на тип, который не существует в специализированной версии шаблона. Если описанное вами поведение было правильным, это не сработало. Или, по крайней мере, вам нужно будет определить enable_if, используя две специализации вместо общей и одной специализации (что не так).

Я думаю, что это ситуация «XY»: вы хотели бы что-то сделать, но я думаю, что вы должны пересмотреть свой дизайн, чтобы вам не нужно было делать это. Я могу представить себе ситуации, когда получение общей функции-члена шаблона было бы полезно, но оно должно быть относительно редким, и это не кажется мне одним из таких случаев.

Скорее всего, если вся точка вашего шаблона должна поместить тип T в точку, а точка в точке не имеет смысла, вы должны просто статично утверждать, что T не является самим классом класса точек , Какая дополнительная функциональность дает вам специализация? Зачем вам нужна специализированная специализация?

+0

Оказалось, что моей интерпретации веб-сайта не хватает. В частности, он комментирует их код, что функция должна быть определена, но я думаю, я слишком спешил, чтобы пройти все это. Идея имея прямоугольник > или треугольник > создать класс со ссылками, чтобы указать так я могу иметь объекты, как треугольники соединяют с образованием сетки, и использовать одну точку, чтобы представлять каждую вершину – user4578093

+0

Это не вообще хорошая идея хранить ссылки на внешние объекты в объекте, вы можете легко обманывать ссылки. Честно говоря, я бы, вероятно, полностью отказался от шаблонов и просто использовал прямоугольник, который хранит Point , если вы не ожидаете использовать что-то другое, кроме двухместных. Не платите за сложность, которая вам не нужна. –

Смежные вопросы