因此,当使用模板显式实例化和完全模板类专门化时,我得到了一个未定义的引用错误,但问题是,部分模板类专门化没有错误。
代码如下所示,有人知道原因吗?在这种情况下,完全专业化和局部专业化有什么区别?
提前谢谢。
// t.h
#include <iostream>
using namespace std;
template <typename T1, typename T2>
class A {
public:
void foo();
};
// t2.cpp
#include "t.h"
template<typename T1>
class A<T1, int> {
public:
void foo() {
cout << "T1, int" << endl;
}
};
template<>
class A<int, int> {
public:
void foo() {
cout << "int, int" << endl;
}
};
template class A<float, int>;
template class A<int, int>;
// t.cpp
#include "t.h"
int main() {
A<float, int> a;
a.foo(); // no error
A<int, int> a1;
a1.foo(); // undefined reference error, why?
return 0;
}编译命令为g++ t.cpp t2.cpp -o t,gcc为4.8.5。
发布于 2019-03-02 01:40:56
您必须在中声明、部分和显式的专门化--使用它们的每个转换单元(在任何隐式实例化该专门化的使用之前)。在这里,看起来就像
template<class T> class A<T,int>;
template<> class A<int,int>;紧接主模板之后(以避免任何错误的隐式实例化的可能性。
在历史上,编译器一直对此“松懈”,也就是说,有时它会执行对所有源文件进行分析时所期望的结果。
您已经在这个特定的编译器中找到了这种意外的“支持”的边缘。
https://stackoverflow.com/questions/54937972
复制相似问题