“未定义引用”错误声明具有双模板类

时间:2017-09-02 19:19:01

标签: c++ templates

我有一个使用双参数模板的类:

template<class T, class R>

当我尝试在main.cpp中声明一个对象时,它说:“对FileTest<int, int>::FileTest()的未定义引用

以下是代码:

FileTest.h

#ifndef FILETEST_H
#define FILETEST_H
#include <string>
#include <iostream>

....

using namespace std;

template<class T, class R>
class FileTest : public FileInput , FileOutput
{

    public:
        FileTest();

        FileTest(const string nome_file):FileInput(nome_file),FileOutput(nome_file){
        };

        virtual ~FileTest();

        void setNewEntry(const T id_domanda,const R id_risposta);

        ...



    private:
        ...

};
template<class T, class R>
FileTest<T,R>::~FileTest()
{
    //dtor
}


template<class T, class R>

void FileTest<T, R>::setNewEntry(const T id_domanda,const R id_risposta){
  /*
    sets new entry in a vector
*/


}

#endif // FILETEST_H

的main.cpp

 #include <iostream>

    #include "FileTest.h"

    using namespace std;

int main()
{

    FileTest<int, int>  object;
    return 0;
}

错误(在main.cpp中):

  

FileTest<int, int>::FileTest()

的未定义引用

当我尝试另一个只有一个模板参数的类时,一切正常!这个错误的原因是什么?

2 个答案:

答案 0 :(得分:2)

您为FileTest声明了一个零参数构造函数:

template<class T, class R>
class FileTest : public FileInput , FileOutput
{

    public:
        FileTest();

但我无法在任何地方看到该方法的实现。由于这是模板类的构造函数,因此它的实现应位于头文件中。

答案 1 :(得分:2)

<强>问题

您已声明没有参数的构造函数

FileTest();

但没有在任何地方提供他的定义,因此链接器将找不到它,如果您尝试调用此函数,这将导致“未定义引用”

在main FileTest<int, int> object;

中构造对象时,将调用此参数没有参数

<强>修正

将构造函数更改为

FileTest() {}

FileTest() = default;