假设我们有以下类模板:
template<typename T, size_t m, size_t n>
class Matrix {
/* Implementation/Declaration is probably irrelevant and has been omitted. */
};
我想为我的模板类专门化一个函数。
template<> template<typename T, size_t m, size_t n>
inline std::wstring Microsoft::VisualStudio:CppUnitTestFramework::ToString(const Matrix<T, m, n> &mtrx) {
/* Definition omitted */
}
(是的,我专注的功能是一个真正的功能,不应该太难找到。)
我认为没有理由为什么上面的代码是错误的,但是在编译时我会得到以下(非常无用的)错误消息(在您询问之前,已包含正确的文件):
C2244: 'ToString': unable to match function definition to an existing declaration
由于人们不可避免地要求它,我不妨包括我专注的功能的原型:
template <typename Q> static std::wstring ToString (const Q& q);
并且,对于没有模板参数的类(例如:std :: string),我没有问题。
答案 0 :(得分:1)
您不需要专业化 - 不存在功能模板的部分特化。相反,你想要一个过载。并且无法在命名空间之外定义重载 - 您需要重新打开命名空间。像这样:
namespace Microsoft {
namespace VisualStudio {
namespace CppUnitTestFramework {
template<typename T, size_t m, size_t n>
std::wstring ToString(const Matrix<T, m, n> &mtrx) {
/* Definition omitted */
}
}}} // end namespaces