功能模板超载分辨率在Visual C 2017中失败
Function template overload resolution fails in Visual C++ 2017
我试图弄清楚我写的是法律c 14 W.R.T.明确的功能模板超载分辨率。
我认为,以下程序应编译并返回3
。
各种版本的clang和GCC仅在编译时(使用-std=c++14 -O2
)计算该版本,但是Visual C 2017(版本15.5.2;写作时的最新更新)用以下错误消息窒息。
enum class Enum0 { State };
enum class Enum1 { State };
template <Enum0 Param0 = Enum0::State>
int get()
{
return 1;
}
template <Enum1 Param1>
int get()
{
return 2;
}
int main()
{
int sum = 0;
sum += get(); // should call instantiation of first function template
sum += get<Enum1::State>(); // should call instantiation of second function template
return sum;
}
这是Visual C 编译器发出的错误消息:
20 : <source>(20): error C2668: 'get': ambiguous call to overloaded function
11 : <source>(11): note: could be 'int get<Enum1::State>(void)'
5 : <source>(5): note: or 'int get<Enum0::State>(void)'
20 : <source>(20): note: while trying to match the argument list '()'
有关现场演示,请参见https://godbolt.org/g/phh2vy(以及https://godbolt.org/g/bvev79,请参见上一个代码示例,然后再编辑问题)。将编译器更改为MVSC,以查看编译失败。海湾合作委员会和Clang没有任何问题。两者都很好地排放以下X86组件:
mov eax, 3
ret
GCC和Clang太宽了,还是Visual C ?
这是一个很好的问题,不是。如果我更改第二个通话:
sum += get<Enum1::State, int>(0.0); // should call instantiation of second function template
...然后编译...
注意,我添加了第二个模板参数。在日常工作中,我使用了与MFC兼容的C 的旧方言...因此,用一粒盐来采取推理。但是,由于您仅向模板提供一个参数,而第二个模板需要两个参数,即VC 编译器正在尝试使用第一个模板,因为它具有默认参数,并且只能采用一个参数。因此,它选择了该模板,但不能从ENUM1转换为Enum0。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- Visual Studio 2017 STL 可视化工具失败了一个 std::map<MyIntrusivePtr, std::tuple<....> >
- VS 2017 构建工具失败,出现错误 MSB4019:找不到导入的项目"D:Microsoft.Cpp.Default.props"
- 功能模板超载分辨率在Visual C 2017中失败
- 在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败