Несоответствие в формальном списке параметров при компиляции шаблонной функции - PullRequest
1 голос
/ 20 июня 2019

Я получаю ошибку времени компиляции при компиляции шаблонной функции, ошибка:

ошибка C2563: несоответствие в формальном списке параметров

Не могу понятьгде проблема, компилятор мало что говорит, вы понимаете, в чем проблема?

#include <cmath>    // temporary
#include <iostream>
#include <cassert>

namespace math
{
    //
    // Power function
    //
    template<typename Exp>
    double pow(double base, Exp exponent)
    {
        assert(!(base == 0 && exp <= 0));

        if (base == 0)
            return 0;

        if (exponent == 0 || base == 1)
            return 1;

        if (exponent == 1)
            return base;

        if (exponent < 0)
            return 1 / pow(base, -exponent);

        return base * pow(base, exponent - 1);
    }

    //
    // Power specialization for real exponents
    //
    template<>
    double pow(double base, double exponent)
    {
        // TODO: handle real negative exponents
        return exp(exponent * log(base));
    }
}

int main()
{
    // error C2563:  mismatch in formal parameter list
    std::cout << "pow" << std::endl;
    std::cout << math::pow(1, 2) << std::endl;
    std::cout << math::pow(0, 2) << std::endl;
    std::cout << math::pow(2, 0) << std::endl;
    std::cout << math::pow(3, -4) << std::endl;

    return 0;
}

1 Ответ

0 голосов
/ 20 июня 2019

Я думаю, что должен написать ответ, чтобы другие могли его увидеть.

В комментарии, написанном Мартином Мортеролом, он объясняет, почему вы получаете ошибку.

Вы сравниваете функцию exp с 0.assert(!(base == 0 && exp <= 0));

Я предполагаю, что вы хотите утверждать против отрицательных показателей, поэтому я заменил exp на exponent, и он выдал правильные данные в соответствии с предположением.

Exp - это функция, доступная вЗаголовок cmath, который возвращает экспоненциальную функцию base-e для x, которая e возведена в степень x: ex.

Что касается того, почему GCC компилируется, то похоже, что он полностью игнорирует строку утверждения, как видно наGodbolt, если мы посмотрим в сборке

https://godbolt.org/z/BZIw8z

Если мы заменим assert на static_assert, gcc выдаст нам ту же ошибку, что и clang

https://godbolt.org/z/UpQ6Ks

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...