以下包装扩展有什么问题?

时间:2015-01-01 07:56:36

标签: c++ c++11 variadic-templates user-defined-literals

constexpr int ipow(int x, int n) {
    return (n > 0) ? x * ipow(x, n - 1): 1;
}
template <char c>
constexpr int b3_helper() {
    static_assert(c < '3', "not a ternary digit");
    return c - '0';
}
template <char c, char... chars>
constexpr int b3_helper() {
    static_assert(c < '3', "not a ternary digit");
    return ipow(3, sizeof...(chars)) * (c - '0') + b3_helper<chars...>();
}
template <char... chars>
constexpr int operator"" _b3() {
return b3_helper<chars...>();
}
int main(){
    int i = 201_b3;
    return 0;
}

编译器说

  

致电&#39; b3_helper&#39;暧昧&#34;在第12行;

我该如何解决?当我学习C ++编程语言时,我发现了这个问题。在第560页

1 个答案:

答案 0 :(得分:0)

歧义是因为b3_helper<'1'>这样的调用有两个同样出色的匹配 - 第一个功能模板可以与char c = '1'匹配,第二个功能模板可以与char c = '1'和{匹配{1}}是空参数包。要解决此问题,您可以更改&#34;归纳&#34;要求两个或多个...这样的函数重载:

char