困惑于模板方法专业化

时间:2015-08-22 21:41:55

标签: c++ templates

我一直试图理解这一点,但无法让它发挥作用。我的印象是这应该有效: -

template <int I> struct banana {
    int getNumber() { return 5; }

    int getNumber<0>() { return 6; }
};

因此,如果我使用0以外的任何模板参数创建一个新的banana,getNumber()应该返回5,如果参数是1,它应该返回6.为什么它不起作用?

2 个答案:

答案 0 :(得分:4)

因为那不是专业化的方式。你需要的是

#include <iostream>

template <int I> struct banana {
    int getNumber() { return 5; }

    //int getNumber<0>() { return 6; } // WRONG
};

template<> int banana<0>::getNumber(){ return 6;} // CORRECT WAY OF SPECIALIZING

int main()
{
    banana<42> foo;
    banana<0> bar;

    std::cout << foo.getNumber() << std::endl; // outputs 5
    std::cout << bar.getNumber() << std::endl; // outputs 6
}

Live on Coliru

答案 1 :(得分:0)

有两种方法可以获得你想要的东西......取决于你想要的东西。

扩展vsoftco的答案:

#include <iostream>

template <int I>
struct banana {
    int getNumber() { return 5; }
};

template<>
struct banana<0>
{
    int getNumber() { return 6; }
};

struct banana2
{
    template<int I> int getNumber() { return 5; }
};

template<>
int banana2::getNumber<0>() { return 6; }


using namespace std;

auto main() -> int
{
    banana<42> foo;
    banana<0> bar;

    std::cout << foo.getNumber() << std::endl;
    std::cout << bar.getNumber() << std::endl;

    banana2 b2;
    std::cout << b2.getNumber<400>() << std::endl;
    std::cout << b2.getNumber<0>() << std::endl;


    return 0;
}

预期产出:

5
6
5
6