【问题标题】:Overloading a function that returns a vector so that it can return a vector of different type [duplicate]重载返回向量的函数,以便它可以返回不同类型的向量[重复]
【发布时间】:2014-01-01 22:17:03
【问题描述】:

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

我试图编译它,它给了我上述错误....

【问题讨论】:

    标签: c++ vector overloading complex-numbers


    【解决方案1】:

    方法的返回类型未在重载决议中使用。

    为什么?原因很多,但最简单的就是当返回值被忽略时,你无法猜测调用了什么函数,这是完全合法的。

    例如:

    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之类的了……

    【讨论】:

    • 我现在明白了; // 我想我需要一个独立于我正在处理的示例的示例...
    • 另外,我发现在我的情况下没有充分的理由进行超载; // 因为实数是虚部为零的复数 /*我本可以返回一个 std::vector&lt;std::complex&lt;long double&gt; &gt; 并检查 Im(roots[index]) == 0 */
    【解决方案2】:

    返回类型不参与重载决议。

    【讨论】:

    • 我认为问题是为什么会这样。
    • 是的,所以这不能回答问题。
    【解决方案3】:

    返回类型不是函数签名的一部分。这真的没有多大意义。当只有返回类型发生变化时,您如何期望类型推导起作用?即:

    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 的“The C++ Programming”的第 7.4.1 小节 Language"): "在重载决议中不考虑返回类型。 原因是为单个操作员保留分辨率或 函数调用上下文无关。考虑:

    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? 进行广泛讨论。

    【讨论】:

      【解决方案4】:

      这与向量无关; 您不能重载返回类型

      [C++11: 13.1/2]:某些函数声明不能​​重载:

      • 仅返回类型不同的函数声明不能​​重载。
      • [..]

      至于基本原理:好吧,编译器如何知道您要调用哪个函数?它只能根据你给它的论据来选择。

      你的期望很像走进一家餐馆,然后开始以下互动:

      &lt;mike_warren&gt;晚上好。我想要我最喜欢的一餐。
      &lt;waiter&gt;先生,您最喜欢的一餐是什么?
      &lt;mike_warren&gt;您无法获得该信息。
      &lt;waiter&gt;您能否提供任何提示或提示这可以让我确定您想要提供哪种食物?
      &lt;mike_warren&gt; 不,抱歉。您只有在上菜后才能知道我最喜欢的食物是什么。
      &lt;waiter&gt; 先生,这没有多大意义。如果事先不知道你最喜欢的食物是什么,我无法为你提供食物……只有从这些信息中,厨师才会知道如何准备你的饭菜。
      &lt;mike_warren&gt; 那我认为我们有问题了。
      &lt;waiter&gt; 离开之前我报警。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多