如果这个问题的根源在于我对模板概念本身的深刻理解,我真的很抱歉。
我定义了以下课程。
#include <iostream>
template <typename T>
class T3B_data{
public:
T3B_data<T>();
~T3B_data<T>();
void fromText(std::istream& is);
void fromText(const std::string& textPath);
void fromBinary(std::istream& is);
std::ostream & toText(std::ostream& oStream)const;
std::ostream & toBinary(std::ostream& oStream);
friend inline std::ostream& operator << (std::ostream & oStream,const T3B_data<T> & data){
return data.toText(oStream);
}
private:
T * mObj;
};
为了进行简单的模板测试,我尝试使用以下main来实例化它
#include "T3B_data.h"
int main(void){
T3B_data<int> * myData = new T3B_data<int>();
return 0;
}
我不明白为什么我必须通过添加:
明确地实例化模板template class T3B_data<int>;
在头文件的末尾,供编译器查找类构造函数。
我完全清楚,追加这条线实际上会强制推出一个全新的类。我只是不明白为什么main中的代码实际上并没有在编译器级别强制模板实例化。
我确信我犯了错误,因为在使用STL容器时,无论何时使用自定义类型,我都不需要实例化它:
struct myStruct{
int a;
std::string;
};
std::vector<myStruct> a;
感谢任何对此问题感兴趣的人。
在我的实现中必须完全错误,因为我在声明结束时使用{}将头文件移动到我的主要和存根实现中。没有模板类T3B_data,一切都编译得很好;声明。
问题最终与separating constructor implementation with template from header file
重复答案 0 :(得分:0)
如果您正在使用template
类的实现文件和头文件,那么编译器需要知道将与该类一起使用的任何类型以用于内存保留,因此您必须明确声明{{1} (正如你所做的)如果你在程序的其他地方使用template class T3B_data<int>
类型作为类的模板参数。
为避免必须这样做,您可以在头文件中定义和实现模板类的所有方法,而不是使用单独的实现文件(根据您的要求和模板类的大小,最好根据码)。