C++ 类模板出错
全部, 在我的头文件中,我有:C++ 类模板出错,c++,c++11,templates,C++,C++11,Templates,全部, 在我的头文件中,我有: template<class T> __declspec(dllexport) MyClass : public MyBaseClass // line 1 { public: template <class T>MyClass(T obj); ~MyClass(); }; template<class T> __declspec(dllexport) MyClass::MyClass( T obj ) :
template<class T>
__declspec(dllexport) MyClass : public MyBaseClass // line 1
{
public:
template <class T>MyClass(T obj);
~MyClass();
};
template<class T> __declspec(dllexport) MyClass::MyClass( T obj ) : MyBaseClass() // line 2
{
// body of the constructor
}
MyClass::~MyClass()
{
}
模板
__declspec(dllexport)MyClass:public MyBaseClass//第1行
{
公众:
模板MyClass(T obj);
~MyClass();
};
在我的.cpp文件中,我有:
template<class T>
__declspec(dllexport) MyClass : public MyBaseClass // line 1
{
public:
template <class T>MyClass(T obj);
~MyClass();
};
template<class T> __declspec(dllexport) MyClass::MyClass( T obj ) : MyBaseClass() // line 2
{
// body of the constructor
}
MyClass::~MyClass()
{
}
template\uu declspec(dllexport)MyClass::MyClass(T obj):MyBaseClass()//第2行
{
//构造函数的主体
}
MyClass::~MyClass()
{
}
此代码在MSVC 2017上出错。MyBaseClass不是模板类
所以我有两个问题:
模板会产生错误
第1行缺少类型说明符-假定为int//
第2行的::左边必须是class/struct/union//
[编辑]
要提供更多背景信息:
我有两个结构,不同的是一个额外的成员,需要推送到这个类。因此,我决定将其设置为模板类,并根据类型调用构造函数
我真的不想重载构造函数,因为它只是一个代码复制粘贴,这不是一个好的设计
[/EDIT]修复代码中缺少的一些关键字,并将构造函数模板参数更改为
R
,因为您已经在类中使用了T
,您可以执行以下操作:
//header
template<class T>
class __declspec(dllexport) MyClass : public MyBaseClass {
public:
template <class R>
MyClass(R obj);
~MyClass();
};
//cpp file
template<class T>
template<class R>
//template<class T, class R> does not work
__declspec(dllexport) MyClass<T>::MyClass<R>(R obj) : MyBaseClass() {}
template<class T>
MyClass<T>::~MyClass() {}
//头
模板
类uu declspec(dllexport)MyClass:公共MyBaseClass{
公众:
模板
MyClass(R obj);
~MyClass();
};
//cpp文件
模板
模板
//模板不起作用
__declspec(dllexport)MyClass::MyClass(R obj):MyBaseClass(){}
模板
MyClass::~MyClass(){}
如果您的意思是只有一个模板类型,则无需指定要模板化的构造函数:
//header
template<class T>
class __declspec(dllexport) MyClass : public MyBaseClass {
public:
MyClass(T obj);
~MyClass();
};
//cpp file
template<class T>
__declspec(dllexport) MyClass<T>::MyClass(T obj) : MyBaseClass() {
// body of the constructor
}
template<class T>
MyClass<T>::~MyClass() { }
//头
模板
类uu declspec(dllexport)MyClass:公共MyBaseClass{
公众:
MyClass(T obj);
~MyClass();
};
//cpp文件
模板
__declspec(dllexport)MyClass::MyClass(T obj):MyBaseClass(){
//构造函数的主体
}
模板
MyClass::~MyClass(){}
btw在头文件中内联模板类的方法体是正常的,并且没有cpp文件。谢谢。我在找后者。现在,我正在尝试使用这个类。看起来我不能像MyClass*o
那样使用它作为标题的指针,然后在cpp文件中创建实际对象,像o=newmyclass(bar)代码>但即使我这样做:MyClass*o=newmyclass(bar)
,即使我链接到导出MyClass
的库,我仍然会收到关于undefined external symbol
的链接器错误。编译成功,但链接失败。有什么想法吗?