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

Why do i need to specialize my template class to use it in c++?

本文关键字:c++ 专门化 我的 为什么      更新时间:2023-10-16

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

我定义了以下类。

#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;
};

为了进行一个简单的模板测试,我尝试了以下主要内容来实例化它

#include "T3B_data.h"
int main(void){
  T3B_data<int> * myData = new T3B_data<int>();
  return 0;
}

我不明白为什么我必须通过添加来明确地安装模板

template class T3B_data<int>;

在头文件的末尾,编译器可以找到类构造函数。

注:

我完全意识到,添加这一行实际上会强制生成一个全新的类。我只是不明白为什么主代码实际上没有在编译器级别强制执行模板实例化。

注2:

我很确定我做错了什么,因为当使用STL容器时,每当我将其与自定义类型(如:)一起使用时,我不需要实例化它

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

提前感谢任何对这个问题感兴趣的人。

编辑:

当我在声明末尾使用{}将头文件移动到主实现和存根实现中时,我的实现中一定有完全错误的地方。并且在没有模板类T3B_ data的情况下一切都编译得很好;公告

问题最终是将带有模板的构造函数实现与头文件分离的重复

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

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