2

我在头文件中有一个模板类 myClass 原型,并在头文件末尾包含的 .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;
}

我的类.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_ */

我的类.cpp

using namespace std;

template <class T>
void myClass<T>::myFunction(const T item)
{
    cout << "Hello World!";
}

我正在使用带有 GNU GCC 编译器的 Code::Blocks 10.05。

4

5 回答 5

3

我终于通过从构建配置中删除 myClass.cpp 解决了这个问题。不知道为什么这是必要的,但它现在完美无缺。

于 2013-04-01T21:28:07.420 回答
1

将方法的实现也放在头文件(.h)中

编译器需要知道翻译单元中的实现细节。

于 2013-03-31T06:50:34.773 回答
0

在文件中声明模板并在.h文件中定义它是非常困难的.cpp。编译器需要在单个文件中声明和定义模板才能创建代码。因此,如果您的编译器不支持export关键字,它将无法工作。所以你不应该使用不同的文件来声明和定义。另请参阅线程。

于 2013-03-31T06:49:59.387 回答
0

模板是按需实例化的,并且考虑到编译器设计中会引入的复杂性,大多数编译器都会构建一个限制,以将模板声明和定义保存在一个文件中。如果不是这样,在类和函数定义之上的模板声明将创建一个模式,编译器难以检测模式并实例化模板。

类似的问题已经在Stackoverflow上进行了讨论,并在Parashiftcplusplus.com上进行了解释(阅读:文章末尾的模板和多文件项目)。

希望这可以帮助!

维韦克

于 2013-03-31T07:14:06.757 回答
0

也可以将实现保存在myClass.cpp文件中。除了实现本身之外,您还需要使用特定类型的T. 例如, if Tcould be intand float,myClass.cpp应该是这样的:

using namespace std;

template <class T>
void myClass<T>::myFunction(const T item)
{
    cout << "Hello World!";
}

// Declarations with specific types.
template void myClass<int>::myFunction(const int item);
template void myClass<float>::myFunction(const float item);
于 2021-12-01T13:20:37.513 回答