重载一个返回向量的函数,以便它可以返回不同类型的向量

时间:2014-01-01 22:17:04

标签: c++ vector overloading complex-numbers

我在我的代码中多次遇到过这个问题(现在,我认为没有规避它):出于某种原因,当我尝试编写一个返回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

我试图编译它,它给了我上面提到的错误......

4 个答案:

答案 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>在我报警之前离开。