类错误内的C ++模板专业化

时间:2018-09-18 18:18:37

标签: c++

我对C ++还是很陌生,并且出现以下错误:

.foo

这是代码

FNM_PERIOD

通过阅读错误代码,我在类范围之外编写了模板函数,并且出现了此错误:

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:
    //...
};

1 个答案:

答案 0 :(得分:3)

您需要inline

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

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

按惯例,C ++代码可以分为源文件中的代码和头文件中的代码。源文件仅被编译一次,但是头文件可能被多次编译,因此头文件中的代码可能会导致多个定义错误。因此,通常来说,这就是为什么头文件应仅包含声明,而定义应放在源文件中的原因(此原理有很多例外)。但是从历史上看,有必要将函数定义放在头文件中,以便编译器可以inlined来使用它们,因此发明了inline关键字。

但是,内联关键字从未意味着要内联函数,这只是避免多重定义错误的一种方法,否则会多次编译函数定义代码而导致错误。

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