【问题标题】:MSVC - C2668 ambiguous call to overloaded function - Is it a compiler bug?MSVC - C2668 对重载函数的模糊调用 - 是编译器错误吗?
【发布时间】:2020-08-09 12:09:28
【问题描述】:

MSVC 19.28 拒绝以下代码并显示错误消息:C2668 ambiguous call to overloaded function A::Foo。 它是编译器错误吗?它可以与 gcc、clang 甚至 msvc 19.10 一起编译。 自 MSVC 19.14 起失败,请参阅 here

#include <iostream>

class A {
public:
    template<typename T>
    void Foo(int = {}) {
        std::cout << "Hello World";
    }

    template<typename... T, typename... Args>
    void Foo(Args&&... args) {

    }
};

int main()
{
    A a;
    a.Foo<int>();
}

【问题讨论】:

    标签: c++ visual-studio visual-c++ cl


    【解决方案1】:

    对于调用Foo&lt;int&gt;(),编译器可以推断出Foo&lt;int&gt;() 是第一个模板,Foo&lt;int&gt;(void) 是第二个模板。

    来自temp.deduct.partial#11

    ...如果 G 有一个尾随函数参数包,而 F 没有对应的参数,并且如果 F 没有尾随函数参数包,则 F 比 G 更特化。

    这是一个决胜局,第一个模板被选中。

    无法解决歧义似乎是一个 MSVC 错误。

    【讨论】:

    • “F 没有对应的参数”——但是 F 有对应的参数,匿名int 参数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多