我一直试图理解这一点,但无法让它发挥作用。我的印象是这应该有效: -
template <int I> struct banana {
int getNumber() { return 5; }
int getNumber<0>() { return 6; }
};
因此,如果我使用0以外的任何模板参数创建一个新的banana,getNumber()应该返回5,如果参数是1,它应该返回6.为什么它不起作用?
答案 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
}
答案 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