在第4版的C++编程语言书的第19章中,有一个使用模板技术定义三进制数文字的例子,但该示例无法编译。我尝试按照自己的方式修复它,但它仍无法编译。
什么是定义它的正确方式?
#include <cstdint>
#include <iostream>
using namespace std;
constexpr uint64_t ipow(uint64_t x, uint64_t n)
{
return n > 0 ? x * ipow(x, n - 1) : 1;
}
template <char c>
constexpr uint64_t base3()
{
static_assert(c >= '0' && c <= '2', "Not a ternary digit.");
return c - '0';
}
template <char c, char... tail>
constexpr uint64_t base3()
{
static_assert(c >= '0' && c <= '2', "Not a ternary digit.");
return ipow(3, sizeof...(tail)) * (c - '0') + base3<tail...>();
}
template <char... chars>
constexpr uint64_t operator""_b3()
{
return base3<chars...>();
}
int main()
{
cout << 1000_b3 << endl;
return 0;
}
Clang 给出以下错误:
error: call to 'base3' is ambiguous
return ipow(3, sizeof...(tail)) * (c - '0') + base3<tail...>();
^~~~~~~~~~~~~~
<source>:22:49: note: in instantiation of function template specialization 'base3<'0', '0'>' requested here
<source>:22:49: note: in instantiation of function template specialization 'base3<'0', '0', '0'>' requested here
<source>:28:10: note: in instantiation of function template specialization 'base3<'1', '0', '0', '0'>' requested here
return base3<chars...>();
^
<source>:33:15: note: in instantiation of function template specialization 'operator""_b3<'1', '0', '0', '0'>' requested here
cout << 1000_b3 << endl;
^
<source>:12:20: note: candidate function [with c = '0']
constexpr uint64_t base3()
^
<source>:19:20: note: candidate function [with c = '0', tail = <>]
constexpr uint64_t base3()
^
1 error generated.
什么是定义它的正确方式?