2015-01-01 3 views
2
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; 
} 

компилятор говоритчто случилось с последующим расширением пакета?

вызов «b3_helper» неоднозначно»в строке 12;?

, как я могу это исправить я нахожу эту проблему, когда я узнаю ++ язык программирования 4th C на странице 560

+0

я сожалею. моя ошибка. – Sherwin

ответ

0

Неопределенность состоит в том, что существует два одинаково хороших совпадения для вызова типа b3_helper<'1'> - первый шаблон функции может быть сопоставлен с char c = '1', а второй может быть matche d с char c = '1' и ... является пустым пакетом параметров. Чтобы это исправить, вы можете изменить «индукция» перегрузка функции требует двух или более char «S, как это:

template <char c, char d, char... chars> 
constexpr int b3_helper() { 
    static_assert(c < '3', "not a ternary digit"); 
    return ipow(3, 1 + sizeof...(chars)) * (c - '0') + b3_helper<d, chars...>(); 
} 
+0

большое спасибо! – Sherwin

 Смежные вопросы

  • Нет связанных вопросов^_^