我有一个使用双参数模板的类:
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()
当我尝试另一个只有一个模板参数的类时,一切正常!这个错误的原因是什么?
答案 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;