显式模板专门化-多个定义



我以前做过明确的专业化,我只是不明白为什么这不起作用:

StringUtils.hpp

#ifndef AYC_STRINGUTILS_HPP
#define AYC_STRINGUTILS_HPP
#include <string>
class StringUtils {
public:
template <typename T>
static std::string toString(const T& t);
};
#include "StringUtils.tpp"
#endif //AYC_STRINGUTILS_HPP

StringUtils.tpp

#include "StringUtils.hpp"
template<typename T>
std::string StringUtils::toString(const T& t) {
return std::to_string(t);
}
template<>
std::string StringUtils::toString<std::string>(const std::string& t) {
return t;
}

我得到的错误是链接器错误,抱怨函数toString的多个定义。

项目中的许多文件都使用#include "StringUtils.hpp"

如何尝试修复此错误?StringUtils班有什么问题吗?

除了Brian在答案中提供的解决方案外,您还可以在.hp/.tpp文件中声明专门化,并在.cpp文件中定义它。

StringUtils.hpp文件:

#ifndef AYC_STRINGUTILS_HPP
#define AYC_STRINGUTILS_HPP
#include <string>
class StringUtils {
public:
template <typename T>
static std::string toString(const T& t);
};
// Generic implementation.
template<typename T>
std::string StringUtils::toString(const T& t) {
return std::to_string(t);
}
// Declation of the specialization.
template<>
std::string StringUtils::toString<std::string>(const std::string& t);
#endif //AYC_STRINGUTILS_HPP

StringUtils.cpp文件:

#include "StringUtils.hpp"
// Definition of the specialization.
template<>
std::string StringUtils::toString<std::string>(const std::string& t) {
return t;
}

测试程序:

#include <iostream>
#include "StringUtils.hpp"
int main()
{
std::string a("test");
std::cout << StringUtils::toString(a) << std::endl;
std::cout << StringUtils::toString(10) << std::endl;
}

测试程序输出:

test
10

函数模板的显式(完全(专门化受一个定义规则的约束,因此StringUtils::toString<std::string>不能在多个翻译单元中定义。您可以通过将其声明为inline来解决此问题。

模板函数专业化几乎总是错误的答案。

类是糟糕的命名空间。

只是超载而不是专门化。

namespace StringUtils {
template <typename T>
std::string toString(const T& t){
using std::to_string;
return to_string(t);
}
inline std::string toString(std::string s){ return std::move(s); }
}

重载解析可以满足您的需要,并且它允许有效的签名变化(就像上面一样,我按值取s,这可以避免额外的堆分配(。

另外请注意,我为自定义类启用了to_string的ADL扩展。只需在X的命名空间中重载to_steing(X)StringUtils::toString(X)就会找到它


您的直接问题是需要标记专用inline

相关内容

  • 没有找到相关文章

最新更新