首页 > 解决方案 > 类模板错误

问题描述

全部,

在我的头文件中,我有:

template<class T> 
__declspec(dllexport) MyClass : public MyBaseClass // line 1
{
public:
    template <class T>MyClass(T obj);
    ~MyClass();
};

在我的 .cpp 文件中,我有:

template<class T> __declspec(dllexport) MyClass::MyClass( T obj ) : MyBaseClass() // line 2
{
    // body of the constructor
}

MyClass::~MyClass()
{
}

此代码在 MSVC 2017 上出错。MyBaseClass 不是模板类。

所以我有两个问题:

  1. 不必对模板类中的每个函数进行模板化。但是template<class T>从 .h 和 .cpp 中的构造函数中删除会产生错误。
  2. 修复错误的最佳方法是什么?基类也应该是模板类吗?

错误是:

missing type specifier - int assumed // at line 1 left of :: must be class/struct/union // at line 2

[编辑]

提供更多背景:

我有 2 个结构,它们的区别在于需要推入此类的一个额外成员。所以我决定把它做成一个模板类,并根据类型调用构造函数。

我真的不想重载构造函数,因为它只是一个代码复制粘贴,这不是一个好的设计。

[/编辑]

标签: c++c++11templates

解决方案


修复代码中缺少的一些关键字并将构造函数模板参数更改为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() {}

如果您的意思是只有一种模板化类型,则无需指定要模板化的构造函数:

//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() { }

推荐阅读