Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++中模板中使用类作为参数_C++_C++11_Templates_Template Specialization - Fatal编程技术网

如何在C++中模板中使用类作为参数

如何在C++中模板中使用类作为参数,c++,c++11,templates,template-specialization,C++,C++11,Templates,Template Specialization,A: 我用这样的方式: #include "Class1.h" template <> Class1<Class2>::Class1(){} 在1.h类中: template <class T> class Class1 : Database { public: Class1(); }; 在Class1.cpp中: #include "Class1.h" template <typename T> Class1<T>::

A: 我用这样的方式:

#include "Class1.h"

template <> Class1<Class2>::Class1(){}
在1.h类中:

template <class T>
class Class1 : Database {
public:
    Class1();
};
在Class1.cpp中:

#include "Class1.h"

template <typename T>
Class1<T>::Class1(){
   //Some code
}
主叫班级:

#include "Class1.h"

Class1<Class2> *class1 = new Class1<Class2>();
如果我运行这个,链接器将无法找到Class1

B: 当我使用这样的东西时:

#include "Class1.h"

template <> Class1<Class2>::Class1(){}
链接器能够找到它

我的问题是,我需要在代码中使用A,而不是B

这意味着我不想使用:

我只想使用:


所有教程都说我正确地使用了它,它必须工作。有人能帮助我吗?< /P> < P>当你尝试实例化一个类模板的专业化时,编译器需要访问每个成员定义,否则它无法生成相应的代码。C++模板基本上是一个类固醇上的CopyPASTA工厂。 由于您将实现细节拆分为一个单独的文件,因此无法实例化特定的专门化(也称为Class1)。我想您应该将模板Class1::Class1{}位放在头文件中?如果是这样,那么您的代码可以编译,因为当您在示例中使用Class2时,它对Class2有一个完整的专门化,并且有一个可用的构造函数

示意图上,您有:

模板头->包含在->测试样本cpp文件中 \------------>包含在->模板实现cpp文件中


您可以看到,您的模板的所有实际实现都无法在您的测试样本转换单元中访问。

当您尝试实例化类模板的专门化时,编译器需要能够访问每个成员定义,否则,它无法生成相应的代码。C++模板基本上是类固醇上的CopyPASTA工厂。< /P> 由于您将实现细节拆分为一个单独的文件,因此无法实例化特定的专门化(也称为Class1)。我想您应该将模板Class1::Class1{}位放在头文件中?如果是这样,那么您的代码可以编译,因为当您在示例中使用Class2时,它对Class2有一个完整的专门化,并且有一个可用的构造函数

示意图上,您有:

模板头->包含在->测试样本cpp文件中 \------------>包含在->模板实现cpp文件中

您可以看到,您的模板的所有实际实现都无法在您的测试样本翻译单元中访问。

如注释中所述,Class1是一个模板化类,因此您应该将构造函数放在头文件中,而不是单独的cpp文件中。 否则,您可以将构造函数放在使用它的cpp文件中,但前提是您仅在单个cpp文件中使用它

问题是当你写作的时候

Class1<Class2> *class1 = new Class1<Class2>();
您要求编译器调用并构造Class1的构造函数,但编译器不知道如何构造它,因为它是在另一个文件中定义的编译器,在这个阶段中,只看到Class1.h;不知道Class1.cpp的内容

你的解决方案B

template <> Class1<Class2>::Class1(){}
之所以有效,是因为您正在为Class1定义构造函数专门化,所以编译器知道它

解决方案:删除

template <typename T>
Class1<T>::Class1(){
   //Some code
}
从Class1.cpp开始,并将其放入Class1.h

p、 s:很抱歉我的英语不好。

正如评论中所说,Class1是一个模板类,所以您应该将构造函数放在头文件中,而不是单独的cpp文件中。 否则,您可以将构造函数放在使用它的cpp文件中,但前提是您仅在单个cpp文件中使用它

问题是当你写作的时候

Class1<Class2> *class1 = new Class1<Class2>();
您要求编译器调用并构造Class1的构造函数,但编译器不知道如何构造它,因为它是在另一个文件中定义的编译器,在这个阶段中,只看到Class1.h;不知道Class1.cpp的内容

你的解决方案B

template <> Class1<Class2>::Class1(){}
之所以有效,是因为您正在为Class1定义构造函数专门化,所以编译器知道它

解决方案:删除

template <typename T>
Class1<T>::Class1(){
   //Some code
}
从Class1.cpp开始,并将其放入Class1.h


p、 对不起,我的英语不好。

missing};因为Class1可能是一个打字错误,对吗?否则,只要将Class1及其方法定义放在头文件.Thx中以获得快速答案,代码就可以了。是的};我忘了在这里写。我的密码里有。类和方法原型位于头文件中。其余部分在cpp文件中。由于您将模板代码拆分为多个源文件,我猜您试图在不知道所述模板成员的翻译单元中使用该模板definitions@Byteventurer如果定义位于指定显式实例化的.cpp文件中,则不会。哦,很好,现在它被删除了,我在自言自语。这是对必须将定义放入头文件的断言的响应。那不是真的。很多都是必须的,但这不是一个严格的规则,如果你提前知道你需要什么;因为Class1可能是一个打字错误,对吗?否则,只要将Class1及其方法定义放在头文件.Thx中以获得快速答案,代码就可以了。是的};我忘了在这里写。我的密码里有。类和方法协议
pe在头文件中。其余部分在cpp文件中。由于您将模板代码拆分为多个源文件,我猜您试图在不知道所述模板成员的翻译单元中使用该模板definitions@Byteventurer如果定义位于指定显式实例化的.cpp文件中,则不会。哦,很好,现在它被删除了,我在自言自语。这是对必须将定义放入头文件的断言的响应。那不是真的。很多都是必须的,但这不是一个严格的规则,如果你提前知道你需要什么。可能的重复:当我使用我的代码例如int by:Class1时,它工作得很好,只要我不给代码特殊化,我使用Class1链接器就找不到它。“但我需要一个没有特殊化的解决方案。”JOnathanJOnes说,这可能是因为你的编译器在可以做到这一点的情况下过于慷慨。制作模板类的适当、可移植的方法是公开头文件中的所有定义。TMP表示临时、模板元编程或热机械编程,我承认还有很多其他的含义,但用它来表示模板有点牵强…当我使用我的代码时,例如int by:Class1,它工作得很好,只要我不给代码特殊化,我使用Class1链接器就找不到它。“但我需要一个没有特殊化的解决方案。”JOnathanJOnes说,这可能是因为你的编译器在可以做到这一点的情况下过于慷慨。制作模板类的适当、可移植的方法是公开头文件中的所有定义。TMP意味着temp、模板元编程或Thermomechanical。我承认还有很多其他含义,但用它来表示模板有点牵强。。。