为什么我需要专门化我的模板类才能在c++中使用它
Why do i need to specialize my template class to use it in c++?
如果这个问题的根源在于我对模板概念本身缺乏深刻的理解,我真的很抱歉。
我定义了以下类。
#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>
(正如您所做的那样)。
为了避免这样做,您可以在头文件中定义和实现模板类的所有方法,而不是使用单独的实现文件(根据您的需求和模板类的大小,最好使用代码行)。
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?