为什么我需要专门化我的模板类才能在c ++中使用它?

时间:2016-04-02 19:15:23

标签: c++ templates

如果这个问题的根源在于我对模板概念本身的深刻理解,我真的很抱歉。

我定义了以下课程。

#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中的代码实际上并没有在编译器级别强制模板实例化。

注2:

我确信我犯了错误,因为在使用STL容器时,无论何时使用自定义类型,我都不需要实例化它:

struct myStruct{
    int a;
    std::string;
};
std::vector<myStruct> a;

感谢任何对此问题感兴趣的人。

编辑:

在我的实现中必须完全错误,因为我在声明结束时使用{}将头文件移动到我的主要和存根实现中。没有模板类T3B_data,一切都编译得很好;声明。

问题最终与separating constructor implementation with template from header file

重复

1 个答案:

答案 0 :(得分:0)

如果您正在使用template类的实现文件和头文件,那么编译器需要知道将与该类一起使用的任何类型以用于内存保留,因此您必须明确声明{{1} (正如你所做的)如果你在程序的其他地方使用template class T3B_data<int>类型作为类的模板参数。

为避免必须这样做,您可以在头文件中定义和实现模板类的所有方法,而不是使用单独的实现文件(根据您的要求和模板类的大小,最好根据码)。