当类有多个模板参数时,专门的成员模板?

use*_*866 2 c++ templates c++11

在下面的类模板中,我们可以Foo::Bar()为某个类型专门化成员,比如T= int:

template <typename T>
class Foo
{
public:
    void Bar()
    {
       std::cout << "generic Bar()" << std::endl;
    }
};

template<>
void Foo<int>::Bar()
{
    std::cout << "specialized Bar()" << std::endl;
}

int main()
{
    Foo<char> generic_foo;
    Foo<int> specialized_foo;

    generic_foo.Bar();
    specialized_foo.Bar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果类Foo有几个模板参数,我们怎么能这样做:

template <typename T, int N>
class Foo
{
public:
    void Bar()
    {
       std::cout << "generic Bar()" << std::endl;
    }
};

// How can we specialize Foo::Bar() for T = int?

int main()
{
    Foo<char, 0> generic_foo;
    Foo<int, 0> specialized_foo;

    generic_foo.Bar();
    specialized_foo.Bar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种替代品来专门Foo::Bar()用于T= int,包括:

template<int N>
void Foo<int, N>::Bar()
{
    std::cout << "specialized Bar()" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是编译器拒绝了所有这些.

For*_*veR 5

模板函数没有部分特化.你应该专攻class.

template<int N>
class Foo<int, N>
{
public:
   void Bar()
   {
      std::cout << "specialized Bar()" << std::endl;
   }
};
Run Code Online (Sandbox Code Playgroud)