C++类错误中的模板专用化

C++ template specialization inside a class error

本文关键字:专用 错误 C++      更新时间:2023-10-16

我是 c++ 的新手,我有以下错误:

error: explicit specialization of 'get' in class scope
template <> string get<string>() {

这是代码

class ReadFile {
public:
template <typename T> T get() {
//...
}
template <> string get<string>() {
//...
}
private:
//...
};

通过读取错误代码,我在类范围之外编写了模板函数,并得到了此错误:

duplicate symbol __ZN8ReadFile3getINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEET_v in:

那么,如果这不起作用,应该怎么写? 感谢您的任何帮助!

当我在类范围之外写它时,我是这样写的:

class ReadFile {};
template <> string ReadFile::get<string>() {
//...
}

你需要inline

template <> inline string ReadFile::get<string>() {
//...
}

在类定义中声明的函数(例如在class ReadFile { ... };内部(默认是内联的。这就是为什么只有在将函数定义移到类定义之外时才会看到此问题的原因。

按照惯例,C++代码可以分为源文件中的代码和头文件中的代码。源文件仅编译一次,但头文件可能会编译多次,因此头文件中的代码可能会导致多个定义错误。因此,一般来说,这就是为什么头文件应该只包含声明,定义应该放在源文件中(这个原则有很多例外(。但从历史上看,人们认为需要将函数定义放在头文件中,以便编译器可以内联它们,因此为此目的发明了内联关键字。

然而,内联关键字的含义从来都不是函数应该内联的,它只是避免多次编译函数定义代码会导致多个定义错误的方法。

此外,使用现代编译器和链接器,函数可以在任何地方内联,因此将函数放在头文件中通常只是方便的问题。例外是函数模板和类模板的方法(出于完全不同的原因(仍然需要进入头文件,并且仍然需要为此而内联。