c++ - "Ambiguous call to overloaded function"在 MSVC 编译器中带有枚举类

标签 c++ c++11 visual-c++

我正在尝试使用值进行模板特化,一个化身是 bool,而另一个是枚举类。我和编译器纠缠了一天,也没能克服“对重载函数的模糊调用”错误。 该代码丑陋且相当长,但这是一个简单的测试用例:

#include <iostream>

enum class Foo { Bar };
enum class Waldo { Fred };

template<Foo ARG, typename... _Types>
inline bool DOIT( _Types&&... _Args )
{
    return true;
}

template<Waldo ARG, typename... _Types>
inline bool DOIT( _Types&&... _Args )
{
    return false;
}

int main()
{
    std::cout << DOIT<Foo::Bar>() << std::endl;
    std::cout << DOIT<Waldo::Fred>() << std::endl;
    return 0;
}

clang 3.8 和 gcc 4.8.3 都能顺利编译它,标准设置为 c++11,但 MSVC 一直向我发送 C2668 错误消息。

据我所知,枚举类的一个原因是为了避免隐式转换,但不确定。这是编译器错误,还是标准中的某些缺陷?

最佳答案

从技术上讲,您发布的代码是一个格式错误的程序,不需要诊断,因为您使用的标识符以 _ 开头,后跟一个大写字母。此类标识符由标准保留给编译器的实现者。

但这不是你的问题。


我见过一个案例,MSVC 在遵循标准时做对了,而 gcc 和 clang 都做错了。

最重要的是,这里的歧义是没有意义的。

你的编译器坏了。

一个可行的方法是:

template<Foo ARG, typename... Ts>
inline bool DOIT( std::integral_constant<Foo, ARG>, Ts&&... args )
{
  return true;
}
template<Waldo ARG, typename... Ts>
inline bool DOIT( std::integral_constant<Waldo, ARG>, Ts&&... args )
{
    return false;
}

int main()
{
    std::cout << DOIT(std::integral_constant<Foo, Foo::Bar>{}) << std::endl;
    std::cout << DOIT(std::integral_constant<Waldo, Waldo::Fred>{}) << std::endl;
    return 0;
}

哪个works on this online MSVC compiler .

关于c++ - "Ambiguous call to overloaded function"在 MSVC 编译器中带有枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957603/

相关文章:

c++ - 你如何破译指针+数组的复杂声明?

c++ - Qt 5.12.0 MinGW 7.3 w64从windows 64交叉编译到windows x86

c++ - 根据#define动态编译文件

c++ - 从参数包到可变参数

c++ - 在构造函数中混合可变参数模板和初始化列表

c++ - #ifndef 和#pragma once 的问题

c++ - 如何在 C++ 中检查无限和不确定的值?

c++ - 有没有办法强制使用shared_ptr在堆上创建对象?

c++ - 尝试在C++中使用curl时出现未解析的符号

c++ - 如果初始化需要shared_from_this,如何在一次调用中构建一个类?