3
void outputString(const string &ss) {
    cout << "outputString(const string& ) " + ss << endl;
}

void outputString(const string ss) {
    cout << "outputString(const string ) " + ss << endl;
}

int main(void) {
    //! outputString("ambigiousmethod"); 
    const string constStr = "ambigiousmethod2";
    //! outputString(constStr);
} ///:~

如何进行不同的调用?

编辑:这段代码可以用 g++ 和 MSVC 编译。

谢谢。

4

4 回答 4

10

C++ 不允许您重载函数,其中函数签名的唯一区别是一个接受一个对象,另一个接受一个对象的引用。所以像:

void foo(int);

void foo(int&);

不被允许。

您需要更改参数的数量和/或类型。

在你的情况下,接受 a 的函数,如果你想允许函数改变它的参数reference,你可以让它接受 a 。pointer

于 2009-12-24T09:49:43.343 回答
1

您可以更改其中一种方法的签名。它可能看起来不漂亮,但它是最简单的方法。

所以你原则上可以有

void outputString(const string &ss, int notneeded) {
    cout << "outputString(const string& ) " + ss << endl;
}

void outputString(const string ss) {
    cout << "outputString(const string ) " + ss << endl;
}

当你想调用第一个函数时,只需调用它:

outputString("ambigiousmethod", 0);

这将导致一个有区别的调用。

没有其他方法(我很想在这方面被证明是错误的),因为 C++ 不允许在传递(通过值或通过引用)是签名的唯一区别的情况下重载。

编辑:正如 bzabhi 所指出的,您还可以通过更改对指针的引用来更改签名。在您给出的示例中,这将起作用,但是在某些情况下您可能必须更改功能代码。

于 2009-12-24T09:53:01.970 回答
0

我建议使用为每个函数赋予唯一名称的技术。即,不要使用语法重载。我已经使用它多年了,我只发现了它的优点。

于 2010-04-09T09:50:04.730 回答
0

根据您的代码,您只需要

void outputString(const string &ss).

因为这两种方法都不能更改调用者的参数(因为它是 const 引用或按值传递)。

为什么需要这两种方法?

于 2009-12-24T09:47:17.897 回答