当前位置: 首页 > 知识库问答 >
问题:

MSVC编译器中枚举类的“对重载函数的模糊调用”

田曜瑞
2023-03-14

我试图用值进行模板特化,一个化身是bool,而另一个是enum类。我与编译器斗争了一天,但没有设法克服“对重载函数的模糊调用”错误。那个代码很丑而且相当长,但这是一个简单的测试用例:

#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错误消息。

AFAIK使用enum类的一个原因是为了避免隐式转换,但我不确定。这是一个编译器错误,还是标准中的一些缺陷?

共有1个答案

宋斌
2023-03-14

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

但这不是你的问题。

我曾经见过一个案例,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;
}

它适用于这个在线MSVC编译器。

 类似资料:
  • null 代码也可以在TypeScript游乐场上查看。

  • 我被MSVC无意中的C函数匹配咬了一口。我可以将其简化为以下测试用例: 我希望所有7个test调用都会匹配第一个重载,而GCC(live-example)和Clang(live-example)会像预期的那样匹配: 但MSVC(实例)将案例1和5与“错误”过载匹配(我在MSVC 2013和2015中发现了这种行为): 对于(意外)值为0的常量枚举变量,MSVC似乎更喜欢将其转换为指针。我本以为这种

  • 问题内容: 我已经对这个程序进行了数小时的故障排除,尝试了几种配置,但是没有运气。它是用Java编写的,有33个错误(从之前的50个降低) 源代码: 错误日志(在JCreator中编译): 我觉得这是一个基本错误,但似乎找不到。如果有什么不同,我正在使用JCreator进行编译,并且一切都已正确安装。 更新:我已修复所涉及的错误(类声明和不正确的导入语句(有人回去并删除了一些分号)) 工作代码:

  • 我尝试用g 4.7.2编译以下内容: 它给了我 为什么? 谢谢。

  • 问题内容: 下面是定义枚举类型的代码。 在内部进行编译, 我的理解正确吗? 问题答案: 从功能上讲,是的。从字面上看,不是(您不能为一件事明确地子类化)。有一个。而且您的代码无效(您无法调用),并且需要返回类型。

  • 从原子函数指针调用函数时,如: gcc一点也不抱怨,而clang和msvc在调用时有问题: [clang]:错误:调用类型为'std::atomic的对象 Clang还指定可能的呼叫候选者为: 波动性的这种差异似乎让clang和msvc感到困惑,但海湾合作委员会却没有。 当调用从更改为