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

时间:2014-07-01 07:45:52

标签: 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;
}

如果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;
}

我为Foo::Bar() = T尝试了几种专门用于int的替代方案,包括:

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

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

1 个答案:

答案 0 :(得分:5)

模板功能没有部分专业化。你应该专攻class

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