Я пытаюсь написать шаблоны, которые принимают перечислимые классы в качестве параметров шаблона нетипичного типа, как в приведенном ниже коде.
Когда я пытаюсь скомпилировать этот код с 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?Знаете ли вы какие-либо способы обойти эту проблему?