模板函数成员的模板特化与 class 模板相结合

Template specialization for template function members combined with class template

鉴于以下情况:

class MyClass
{
   public:
      template <typename T, typename U = T>
      void doSomething(T) {}
   private:
      double parser;
};

template<>
inline void MyClass::doSomething<bool>(bool) {}
template<>
inline void MyClass::doSomething<int, double>(int) {}

int main(int argc, char* argv[])
{
   MyClass foo;
   foo.doSomething<bool>(true);
   foo.doSomething<int, double>(10);
   return 0;
}

这很好用。

但是现在我想引入一个 class 模板,以便使用模板参数而不是 ParserClass,像这样:

template<typename P>
class MyClass
{
   public:
      template <typename T, typename U = T>
      void doSomething(T) {}
   private:
      P parser;
};

template<>
inline void MyClass::doSomething<bool>(bool) {}
template<>
inline void MyClass::doSomething<int, double>(int) {}

int main(int argc, char* argv[])
{
   MyClass<double> foo;
   foo.doSomething<bool>(true);
   foo.doSomething<int, double>(10);
   return 0;
}

然而,这不再有效:

test.cpp:12:13: error: 'MyClass' is not a class, namespace, or enumeration
inline void MyClass::doSomething<bool>(bool) {}
            ^
test.cpp:2:7: note: 'MyClass' declared here
class MyClass
      ^
1 error generated.

这可能吗?上面例子中的成员函数模板参数和class模板参数如何组合?

要特化属于模板 class 成员的函数,您需要两个 template<> 声明。此外,您需要为 MyClass:

指定 typename
template<> template<>
inline void MyClass<some_type>::doSomething<bool>(bool) { ... }
template<> template<>
inline void MyClass<some_type>::doSomething<int, double>(int) { ... }