Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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 - Fatal编程技术网

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不是模板类

所以我有两个问题:

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

    第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
    的链接器错误。编译成功,但链接失败。有什么想法吗?