C++ 专用方法模板产生多个定义错误
C++ specialized method templates produce multiple definition errors
我正在使用 C++ 98。我正在编写一个 JSON 对象包装器。对于所有普通数字,它们可以使用相同的函数,但对于浮点数和双精度数,我需要一个单独的函数。字符串也一样。我使用模板和专业化编写了这个,它编译得很好,但是当我构建我的整个项目时,我遇到了大约 10 亿个关于多个定义的错误。我想我的专业不正确。我能够在 class 对象本身中使用和不使用这些定义来编译此文件,所以我什至不知道是否需要这些定义。
class Object {
public:
template <class T>
bool Set(std::string key, T value);
// having these defined or not doesn't seem to matter
bool Set(std::string key, double value);
bool Set(std::string key, float value);
bool Set(std::string key, std::string value);
};
template <class T>
bool Object::Set(std::string key, T value){
}
template <>
bool Object::Set<double>(std::string key, double value){
}
template <>
bool Object::Set<float>(std::string key, float value){
}
template <>
bool Object::Set<std::string>(std::string key, std::string value){
}
如何正确地专门化这些模板,使 compiler/linker 不合适?
如果在头文件中 class 之外定义模板成员函数的特化,则需要像这样进行特化 inline
:
template <>
inline bool Object::Set<double>(std::string key, double value){
}
template <>
inline bool Object::Set<float>(std::string key, float value){
}
template <>
inline bool Object::Set<std::string>(std::string key, std::string value){
}
我正在使用 C++ 98。我正在编写一个 JSON 对象包装器。对于所有普通数字,它们可以使用相同的函数,但对于浮点数和双精度数,我需要一个单独的函数。字符串也一样。我使用模板和专业化编写了这个,它编译得很好,但是当我构建我的整个项目时,我遇到了大约 10 亿个关于多个定义的错误。我想我的专业不正确。我能够在 class 对象本身中使用和不使用这些定义来编译此文件,所以我什至不知道是否需要这些定义。
class Object {
public:
template <class T>
bool Set(std::string key, T value);
// having these defined or not doesn't seem to matter
bool Set(std::string key, double value);
bool Set(std::string key, float value);
bool Set(std::string key, std::string value);
};
template <class T>
bool Object::Set(std::string key, T value){
}
template <>
bool Object::Set<double>(std::string key, double value){
}
template <>
bool Object::Set<float>(std::string key, float value){
}
template <>
bool Object::Set<std::string>(std::string key, std::string value){
}
如何正确地专门化这些模板,使 compiler/linker 不合适?
如果在头文件中 class 之外定义模板成员函数的特化,则需要像这样进行特化 inline
:
template <>
inline bool Object::Set<double>(std::string key, double value){
}
template <>
inline bool Object::Set<float>(std::string key, float value){
}
template <>
inline bool Object::Set<std::string>(std::string key, std::string value){
}