C++类错误中的模板专用化
C++ template specialization inside a class error
我是 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++代码可以分为源文件中的代码和头文件中的代码。源文件仅编译一次,但头文件可能会编译多次,因此头文件中的代码可能会导致多个定义错误。因此,一般来说,这就是为什么头文件应该只包含声明,定义应该放在源文件中(这个原则有很多例外(。但从历史上看,人们认为需要将函数定义放在头文件中,以便编译器可以内联它们,因此为此目的发明了内联关键字。
然而,内联关键字的含义从来都不是函数应该内联的,它只是避免多次编译函数定义代码会导致多个定义错误的方法。
此外,使用现代编译器和链接器,函数可以在任何地方内联,因此将函数放在头文件中通常只是方便的问题。例外是函数模板和类模板的方法(出于完全不同的原因(仍然需要进入头文件,并且仍然需要为此而内联。
相关文章:
- C++类错误中的模板专用化
- 模板专用化会导致未定义的引用错误
- flat_hash_map.h:错误 C3203:"templated_iterator":非专用类模板
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 类模板部分专用化:编译器错误
- 为什么在源文件中专用模板不会导致错误?
- 函数模板(它是类模板的成员)的显式专用化会产生"partial specialization is not allowed"错误,为什么?
- C++模板 - 使用"std::is_same_v"而不是专用并避免编译错误?
- VS2017模板专用化错误无法从'Class *(__cdecl *)(Args...)'转换为'Class *(__cdecl *)(Args...)'
- 函数模板专用化生成链接错误
- 错误 C2908:显式专用化; 已被实例化
- 部分模板专用化错误
- 模板函数专用化的内部编译器错误
- 类模板方法的专用化,类型名称是类模板 - 错误:参数处的类型/值不匹配
- 错误 C2893:无法使用 CTPL 专用化函数模板
- gcc中变量模板的错误显式模板专用化
- Qt nmake:错误 C3203:"map":非专用类模板不能用作模板参数"base"的模板参数,预期为真实类型
- 声明无法解决"实例化后的显式专用化"错误
- 需要"override"案例时重叠模板部分专用化:如何避免错误?