Шаблон C ++: нет подходящей функции для вызова - PullRequest
4 голосов
/ 11 марта 2011

Рассмотрим следующий код

template <typename T, T one>
T exponentiel(T val, unsigned n) {
    T result = one;
    unsigned i;
    for(i = 0; i < n; ++i)
        result = result * val;

    return result;
}

int main(void) {

    double d = exponentiel<double,1.0>(2.0f,3);

    cout << d << endl;

    return 0;
}

Компилятор говорит мне это нет подходящей функции для вызова 'exponentiel (float, int)'

Почему?

Что странно, что exponentiel работает с int.

1 Ответ

10 голосов
/ 11 марта 2011

Проблема с T one и 1.0 в списке аргументов шаблона.

У вас не может быть нетипизированного параметра шаблона типа с плавающей запятой, и вы не можете передать значение с плавающей запятой в качестве аргумента шаблона. Это просто не разрешено (насколько мне известно, на самом деле нет веских причин, по которым это не разрешено).

Сообщение об ошибке

g ++ здесь довольно бесполезно. Visual C ++ 2010 сообщает следующее в строке, где шаблон используется в main:

error C2993: 'double' : illegal type for non-type template parameter 'one'

Comeau Online отчеты:

line 13: error: expression must have integral or enum type
    double d = exponentiel<double,1.0>(2.0f,3);
                                  ^

line 2: error: floating-point template parameter is nonstandard
    template <typename T, T one>
                          ^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...