未定义对部分特化方法的引用 class
Undefined reference to method of partially specialized class
我一直在研究一组代表各种几何体的模板 classes,我意识到我希望能够专门化各种 classes 来处理引用和指针,例如
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 网站(在底部,偏特化成员下的第一个示例)暗示您可以排除偏特化的函数定义,只要您声明了它,它就会默认使用主模板的定义。
如果能够这样做,我将节省几天的工作时间,因为我不必重新定义 class 的所有功能。所以我的问题是,是什么阻碍了我的代码的编译,can/how 我可以将我的 classes 专门用于引用(我仍然需要为指针做这件事)而不必重新定义它们的函数吗?这仅仅是一个引用问题,它改变了代码的工作方式,例如如果使用了主要专业化的功能,则它只会移动引用。
我认为专用 class 模板从非专用 class 模板继承方法实现的想法是不正确的。考虑例如 std::enable_if。 class 的全部要点是通过引用模板的专门版本中不存在的类型来触发替换失败。如果您描述的行为是正确的,那么这将行不通。或者至少,您需要定义 enable_if 使用两个专业而不是一个通用的和一个专业(事实并非如此)。
我认为这是一种 "XY" 情况:您希望能够做某事,但我认为您更有可能应该修改您的设计,这样您就不需要做那件事了。我可以想象得到通用模板成员函数会很有用的情况,但这种情况应该相对较少,而且我认为这不是其中一种情况。
更有可能的是,如果您的模板的全部要点是将类型 T 放入一个点中,而将一个点放入一个点中是没有意义的,您应该只是静态断言 T 本身不是某种 Point 模板class。专业化为您提供了哪些额外功能?为什么需要 reference/pointer 专业化?
我一直在研究一组代表各种几何体的模板 classes,我意识到我希望能够专门化各种 classes 来处理引用和指针,例如
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 网站(在底部,偏特化成员下的第一个示例)暗示您可以排除偏特化的函数定义,只要您声明了它,它就会默认使用主模板的定义。
如果能够这样做,我将节省几天的工作时间,因为我不必重新定义 class 的所有功能。所以我的问题是,是什么阻碍了我的代码的编译,can/how 我可以将我的 classes 专门用于引用(我仍然需要为指针做这件事)而不必重新定义它们的函数吗?这仅仅是一个引用问题,它改变了代码的工作方式,例如如果使用了主要专业化的功能,则它只会移动引用。
我认为专用 class 模板从非专用 class 模板继承方法实现的想法是不正确的。考虑例如 std::enable_if。 class 的全部要点是通过引用模板的专门版本中不存在的类型来触发替换失败。如果您描述的行为是正确的,那么这将行不通。或者至少,您需要定义 enable_if 使用两个专业而不是一个通用的和一个专业(事实并非如此)。
我认为这是一种 "XY" 情况:您希望能够做某事,但我认为您更有可能应该修改您的设计,这样您就不需要做那件事了。我可以想象得到通用模板成员函数会很有用的情况,但这种情况应该相对较少,而且我认为这不是其中一种情况。
更有可能的是,如果您的模板的全部要点是将类型 T 放入一个点中,而将一个点放入一个点中是没有意义的,您应该只是静态断言 T 本身不是某种 Point 模板class。专业化为您提供了哪些额外功能?为什么需要 reference/pointer 专业化?