我在我的代码中多次遇到过这个问题(现在,我认为没有规避它):出于某种原因,当我尝试编写一个返回std::vector<long double>
的方法并尝试重载时它使用相同的方法名称返回不同的std::vector
,比如std::vector<std::complex<long double> >
,我收到类似于以下内容的错误消息:
std::vector<std::vector<long double> > cannot be overloaded with std::vector<long double>
即使我有必要的课程#include'd。 这是为什么?这有什么理由吗?
以下是一些模拟问题的代码:
#ifndef MATRIXALGORITHMS_H
#define MATRIXALGORITHMS_H
#include <complex>
#include <vector>
class MatrixAlgorithms
{
public:
MatrixAlgorithms();
//two algorithms that are not strictly for matrices; they are for solving quadratic and cubic polynomials
//quadratic method; the roots might be real, so there should be two versions of this algorithm
std::vector<long double> quadraticFormula(long double, long double, long double);
std::vector<std::complex<long double> > quadraticFormula(long double, long double, long double);
protected:
private:
};
#endif // MATRIXALGORITHMS_H
我试图编译它,它给了我上面提到的错误......
答案 0 :(得分:3)
返回类型不参与重载决策。
答案 1 :(得分:3)
在重载决策中不使用方法的返回类型。
为什么?有许多原因,但最简单的原因是,当忽略返回值时,您将无法猜测调用哪个函数,这是完全合法的。
E.g:
int f();
double f();
f(); // Which one would you call ?
其他更复杂的原因很容易找到:
int f();
double f();
void g(int);
void g(double);
g(f()); // Which f and g do you call ?
更不用说auto
等等......
答案 2 :(得分:1)
返回类型不是函数签名的一部分。它没有多大意义。当只有返回类型发生变化时,您如何期望类型扣除?即:
auto func = ambiguous(0.0, 0.0, 0.0); // Which one to use?
您可以指定输出参数。这是微软的一个常见习语:
quadraticFormula(long double, long double, long double, TypeOne& out);
虽然这将要求您的用户依赖Intellisense或文档。另一种选择是重命名你的功能。
quadraticFormulaOne(...);
quadraticFormulaTwo(...);
但如果有很多这样的话,这可能很烦人。
C ++(Bjarne Stroustrup的“C ++编程”第7.4.1小节 语言“):”在重载决议中不考虑返回类型。 原因是要保持个别运营商的解决方案 函数调用上下文无关。考虑:
float sqrt(float); double sqrt(double); void f(double da, float fla) { float fl = sqrt(da); // call sqrt(double) double d = sqrt(da); // call sqrt(double) fl = sqrt(fla); // call sqrt(float) d = sqrt(fla); // call sqrt(float) }
如果考虑了返回类型,则不再存在 可以单独查看sqrt()的调用并确定哪个 功能被称为。“
请参阅Function overloading by return type?进行广泛讨论。
答案 3 :(得分:0)
这与载体无关; 您不能在返回类型上重载。
[C++11: 13.1/2]:
某些函数声明不能重载:
- 不能仅在返回类型上有所不同的函数声明。
- [..]
至于理由:嗯,编译器如何知道你打算调用哪个函数?它只能根据您提供的参数进行选择。
您的期望与走进餐厅相似,并启动以下互动:
<mike_warren>
晚上好。我想要我最喜欢的一餐。
<waiter>
先生,您最喜欢的一餐是什么?<mike_warren>
您无法获得该信息<waiter>
您是否可以提供任何提示或提示,以便我确定您想要提供哪种食物?<mike_warren>
不,抱歉。你只会在服完之后找出我最喜欢的食物<waiter>
先生,这没有多大意义。如果事先不知道它是什么,我就无法提供你最喜欢的食物......只有这些信息,厨师才会知道如何准备你的食物。
<mike_warren>
然后我认为我们遇到了问题<waiter>
在我报警之前离开。