C++;类错误中的模板专门化 我对C++很陌生,我有以下错误: error: explicit specialization of 'get' in class scope template <> string get<string>() {

C++;类错误中的模板专门化 我对C++很陌生,我有以下错误: error: explicit specialization of 'get' in class scope template <> string get<string>() {,c++,C++,那么,如果这不起作用,应该如何编写呢? 谢谢你的帮助 当我在类范围外编写它时,我是这样编写的: class ReadFile {}; template <> string ReadFile::get<string>() { //... } 类读取文件{}; 模板字符串ReadFile::get(){ //... } 您需要内联 template <> inline string ReadFile::get<string>() { //... }

那么,如果这不起作用,应该如何编写呢? 谢谢你的帮助

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

class ReadFile {};
template <> string ReadFile::get<string>() {
//...
}
类读取文件{};
模板字符串ReadFile::get(){
//...
}

您需要
内联

template <> inline string ReadFile::get<string>() {
//...
}
模板内联字符串ReadFile::get(){
//...
}
默认情况下,在类定义中声明的函数(例如,
class ReadFile{…};
)是内联的。这就是为什么只在将函数定义移到类定义之外时才会看到这个问题

传统的C++代码可以分为源代码和头文件代码。源文件只编译一次,但头文件可能编译多次,因此头文件中的代码可能会导致多个定义错误。所以,一般来说,这就是为什么头文件应该只包含声明,而定义应该放在源文件中(这一原则有许多例外)。但从历史上看,人们认为有必要将函数定义放在头文件中,这样编译器就可以对它们进行编辑,因此内联关键字就是为此而发明的

然而,内联关键字的意思从来不是函数应该内联,它只是一种避免多次编译函数定义代码所导致的多定义错误的方法


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

您能说明您是如何在类范围之外编写它的吗?即使在类范围之外,它应该仍然在头文件中。相关:我在requestedUmm中添加了更多信息。。。该编辑不会显示在类x.x中声明的任何内容。谢谢,这确实有效!我可以问一下内联是什么意思吗?它意味着你可以将函数定义放入头文件中,而不会出现多个定义错误。@john我相信你可以编辑你的答案,并给出更好/更详细的解释。@JesperJuhl Done
class ReadFile {};
template <> string ReadFile::get<string>() {
//...
}
template <> inline string ReadFile::get<string>() {
//...
}