g ++在* expected *错误消息中给出了奇怪的函数调用

时间:2010-11-13 13:35:24

标签: c++ function g++ compiler-errors

情况如下:

void funct( unsigned u, double d, float f )
{
        u = 12;
}
void funct( double u, int d, void* asd, float f )
{
        u = 13;
}

int main()
{
        const unsigned u = 123;
        double d = 123.123;
        float f = 123.123;

        funct( u, d, f, 123 );

        return 0;
}

给了我:

./src/test.cpp:19: error: no matching function for call to 'funct(const unsigned int&, double&, float&, int)'
./src/test.cpp:4: note: candidates are: void funct(unsigned int, double, float)
./src/test.cpp:8: note:                 void funct(double, int, void*, float)

这是绝对预期的错误,因为没有合适的函数可以调用,好的,没问题。但是看看编译器错误:

                                                          V        V       V
no matching function for call to 'funct(const unsigned int&, double&, float&, int)

为什么这些&在那里?当我拨打正确的电话时 - 一切都很好,所有参数,如预期的那样,不作为参考传递。

使用Ubuntu 10.04,64位和g++ version 4.4.3

3 个答案:

答案 0 :(得分:4)

您正在向该函数传递一个实数变量,该变量可以分配给(“lvalue”)。当然你按值而不是通过引用传递它 - 但重点是,在你的函数调用中你能够通过引用传递它,因为它是lvalue

然后:如果您的值为int&lvalue),则可以将其发送给接受int的函数(rvalue或{ {1}}) - 不是相反。

答案 1 :(得分:4)

编译器不知道您是打算按值还是通过引用传递变量。它不能排除正确的函数(你未声明的函数)期望引用的可能性。

答案 2 :(得分:0)

它尝试映射参数表达式,仅根据类型表达它们。因此,对于T类型的左值,它使用T&,对于T类型的左值,它使用T(未修改)。

当然,参数表达式从不具有引用类型(没有表达式可以具有引用类型),但这是GCC表达它的方式。对于C ++ 0x,将有lvalues,xvalues和prvalues。 GCC可能会使用T&作为第一个,T作为后两个,或T&&作为第二个,T作为后者。

Clang在这里做得更好

main1.cpp:16:9: error: no matching function for call to 'funct'
        funct( u, d, f, 123 );
        ^~~~~
main1.cpp:5:6: note: candidate function not viable: no known conversion from 'float' to 
                     'void *' for 3rd argument                                     
void funct( double u, int d, void* asd, float f )
     ^
main1.cpp:1:6: note: candidate function not viable: requires 3 arguments, but 4 were provided
void funct( unsigned u, double d, float f )
     ^
1 error generated.