Я работаю над набором классов шаблонов, которые представляют различные биты геометрии, и я понял, что хотел бы специализировать различные классы для обработки ссылок и указателей, например.Неопределенная ссылка на метод частично специализированного класса
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 объявили его, и он по умолчанию будет использовать определение основного шаблона.
Будучи в состоянии сделать это, я сэкономил бы дни работы, так как мне не пришлось бы переопределять все функции моего класса. Поэтому мой вопрос заключается в том, что сводит мой код с компиляцией и может/как я могу специализировать свои классы для ссылок (мне все равно нужно сделать это для указателей) без необходимости переопределять их функции? Является ли это просто проблемой ссылок, изменяющих способ работы кода, например. функция первичной специализации просто сместила бы ссылку, если бы она использовалась.
Сообщение об ошибке не может быть связано с кодом, который вы показываете. В коде не упоминается шаблон с именем 'A', а также функция-член с именем' f'. –
Может быть полезно, если вы отправили ошибку компоновщика, которую генерирует ваш код, поскольку в приведенном вами примере кода нет ссылки на 'f()'. – kfsone
Согласно идее (http://ideone.com/JZemgY), ошибка в вашем MVCE является 'undefined reference to 'test :: otherfunc (int)''? –
kfsone