我在头文件中有一个模板类myClass prototyped,并在头文件末尾包含的.cpp文件中实现它。当我使用代码时:
template<typename T>
class myClass {
public:
void myFunction(const T item);
};
头文件中的和
template <class T>
void myClass<T>::myFunction(const T item)
{
//stuff
}
在实现文件中,我在实现代码的第2行得到了上述错误。我在另一个程序中使用了相同的语法,并且编译成功,结果正常,所以我很困惑。 .cpp文件中有三种不同的函数定义,并且它们各自的行都有相同的错误。我假设我犯了一个小错误,但我似乎无法弄明白。
非常感谢帮助和解释。
编辑:
这是一个SSCCE,它有相同的错误: main.cpp中
#include <iostream>
#include "myClass.h"
using namespace std;
int main(){
myClass<int> example;
example.myFunction(1);
return 0;
}
myClass.h
#include<iostream>
#ifndef MYCLASS_H_
#define MYCLASS_H_
template<typename T>
class myClass {
public:
void myFunction(const T item);
};
#include "myClass.cpp"
#endif /* MYCLASS_H_ */
myClass.cpp
using namespace std;
template <class T>
void myClass<T>::myFunction(const T item)
{
cout << "Hello World!";
}
我正在使用Code :: Blocks 10.05和GNU GCC编译器。
答案 0 :(得分:2)
我终于通过从构建配置中删除myClass.cpp来解决问题。不知道为什么这是必要的,但它现在完美地工作。
答案 1 :(得分:1)
将方法的实现也放在头文件(.h
)中
编译器需要知道翻译单元中的实现细节。
答案 2 :(得分:0)
在.h
文件中声明模板并在.cpp
文件中定义模板非常困难。编译器需要在单个文件中进行模板声明和定义才能创建代码。因此,如果您的编译器不支持export
关键字,它将无效。
因此,您不应该使用不同的文件进行声明和定义。另请参见this主题。
答案 3 :(得分:0)
根据需要实例化模板,并且考虑到编译器设计中会引起的复杂性,大多数编译器会构建限制以将模板声明和定义保存在单个文件中。如果不是这样,那么类和函数定义之上的模板声明将为编译器创建一个难以检测模式并实例化模板的模式。
已在Stackoverflow上讨论了类似的问题,并在Parashift和cplusplus.com上解释了(阅读:模板和多文件项目文章)。
希望这有帮助!
的Vivek