类模板和函数的显式特化

时间:2017-02-03 01:42:12

标签: c++ templates visual-c++ compiler-errors

假设我们有以下类模板:

  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),我没有问题。

1 个答案:

答案 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