C++ GCC“;没有用于调用的匹配函数……”;错误

C++ GCC“;没有用于调用的匹配函数……”;错误,c++,visual-c++,gcc,C++,Visual C++,Gcc,我正在开发一个跨平台的代码库,最初的工作是使用MS VC2010编译器完成的。后来我在Linux上使用GCC(4.7)编译它。在许多情况下,我收到: GCC中没有匹配的调用函数。错误。我注意到,当方法参数是非常量引用时,它通常会抱怨。例如: void MyClass::DoSomeWork(ObjectSP &sprt, const std::string someName, const std::string anotherName, const std::string path,

我正在开发一个跨平台的代码库,最初的工作是使用MS VC2010编译器完成的。后来我在Linux上使用GCC(4.7)编译它。在许多情况下,我收到:

GCC中没有匹配的调用函数。错误。我注意到,当方法参数是非常量引用时,它通常会抱怨。例如:

 void MyClass::DoSomeWork(ObjectSP &sprt, const std::string someName, const std::string anotherName, const std::string path, int index) {


        sprt->GetProp()->Update(path, false);

}
一旦我将方法更改为:

 void MyClass::DoSomeWork(const ObjectSP& sprt, const std::string& someName, const std::string& anotherName, const std::string& path, int index) {


        sprt->GetProp()->Update(path, false);

}
GCC停止抱怨。
为什么它会发生,为什么它不会发生在VC编译器中?

将非常量引用绑定到临时引用是非法的。然而,从历史上看,VS编译器在这方面没有那么严格

因此,如果你有一个带有非常量引用的函数,并且你用一个临时对象(例如,函数的返回值)调用它,g++将进行比较,但是VS不会。在本例中,g++是正确的


如果可以,请始终选择常量引用。

我猜您试图将
sprt
绑定到临时对象。