Ошибка компилятора MSVC при перегрузке шаблона с параметром enum - PullRequest
0 голосов
/ 19 февраля 2019

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

Когда я пытаюсь скомпилировать этот код с MSVC2017, я получаю следующие ошибки компилятора:

source_file.cpp(16): error C2668: 'g': ambiguous call to overloaded function
source_file.cpp(10): note: could be 'void g<E2::v>(void)'
source_file.cpp(6): note: or       'void g<E1::v>(void)'
source_file.cpp(16): note: while trying to match the argument list '()'

Clang и gcc, с другой стороны, компилируют мой код без каких-либо сообщений об ошибках и выводят

g1
g2

, как и ожидалось.

#include <iostream>

enum class E1{v};
enum class E2{v};

template<E1 e1> void g(){
    std::cout << "g1" << std::endl;
}

template<E2 e2> void g(){
    std::cout << "g2" << std::endl;
}

int main(){
    g<E1::v>();
    g<E2::v>();
}

(Этот код можно протестировать на rextester .)

Есть ли ошибка в моем коде или это скорее проблема с MSVC?Знаете ли вы какие-либо способы обойти эту проблему?

1 Ответ

0 голосов
/ 26 февраля 2019

Есть ли ошибка в моем коде или это скорее проблема с MSVC?

Для меня это выглядит как ошибка в MSVC.

Знаете ли вы какие-либо способы обойти эту проблему?

Кажется, что если E1::v и E2::v имеют разные значения, то он компилируется правильно.Я проверил это, изменив ваше второе перечисление на это:

enum class E2 { v = 2 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...