【问题标题】:Why doesn't the compiler show an error with these return types?为什么编译器不显示这些返回类型的错误?
【发布时间】:2011-11-05 17:11:05
【问题描述】:

使用最新版本的 NetBeans 运行 Ubuntu 11.10 的默认安装。我有类似以下内容:

class MyClass {
    public:
        Type1 RunAlgo();
    private:
        Type2 Run();
}

Type1 MyClass::RunAlgo() {
    //additional code
    return Run();
}

Type2 Run() {
    //additional code
    Type2 obj;
    return obj;
}

Type1 和 Type2 完全不相关。当我编写 Run() 方法时,我在返回类型中打错了字,并惊讶于它编译成功。我只是想知道为什么这不会返回错误并且编译得很好?我错过了什么?

编辑:新样本。作为独立项目,这确实会产生错误。似乎无法发现为什么真正的项目确实会编译。

class Node { };

//only difference here is that in my code I have a custom comparer
typedef map<Node*, map<Node*, double> > Network; 

class HMM {
    Network _network;
};

class Algorithm {
    public:
        HMM RunAlgo();
    private:
        Network _network;
        Network Run();
};

HMM Algorithm::RunAlgo() {
    return Run();
}

Network Algorithm::Run() {
    return _network;
}

EDIT2:

对于我表述不当的问题和示例,我深表歉意。以后我会更加注意示例。我已经工作了 10 多个小时并且失去了注意力。下面的例子重现了我的情况:

#include <map>

using std::map;

class Node {

};

typedef map<Node*, map<Node*, double> > Network;

class HMM {
    public:
        HMM(const Network& network) {};
    Network _network;
};


class TestClass {
    public:
        HMM RunAlgo(int x, int y);
    private:
        Network _network;
        Network Run();
};

HMM TestClass::RunAlgo(int x, int y) {
    return Run();
}

Network TestClass::Run() {
    return _network;
}  

在将特定构造函数添加到 HMM 类后,它可以毫无问题地编译。我不知道可以这样做,因为这是我第一次遇到这种情况。如果浪费了您的时间,我再次道歉,感谢您尝试帮助我。

【问题讨论】:

  • “一些参数”和“一些参数”是错字吗?还是缺少的分号?他们是问题的一部分吗?请出示您的真实测试用例,以免我们浪费宝贵的时间猜测。
  • 我的错误。将编辑掉一些参数。它们对案件并不重要。对于造成的混乱,我深表歉意。
  • 也许Type1Type2 并没有你想象的那么不相关。请发布他们的声明(至少是他们的构造函数和赋值运算符)
  • 你真的在调用和使用 RunAlgo(...) 吗?
  • @Morat:至少试试你的样品。您在类声明的末尾缺少;。即便如此,GCC 还是拒绝了代码:error: conversion from ‘Network’ to non-scalar type ‘HMM’ requested

标签: c++ function compiler-errors return-type


【解决方案1】:

修复非测试用例中的错误后,my compiler does error out

您关于Type1Type2 不相关的陈述一定是错误的。

下次注意真正的测试用例。

【讨论】:

    【解决方案2】:

    您没有显示您的实际代码;您给我们的示例无法编译(Debian/Sid/AMD64 上的 GCC 4.6)

    % g++ -Wall exmorat.cc 
    exmorat.cc:3:9: error: 'Type1' does not name a type
    exmorat.cc:5:9: error: 'Type2' does not name a type
    exmorat.cc:8:7: error: expected initializer before 'MyClass'
    

    但是当您涉及转换或强制转换时,可能会发生您所描述的情况。您应该展示您的实际代码(或显示症状的简化代码)以获得真正的帮助。

    【讨论】:

    • 他/她应该已经在使用一段简化的代码(或“测试用例”)作为调试基础的一部分。
    • 课程太大,无法在此处发布。我尝试使用简化版本的代码重现此场景,但在这种情况下它确实会产生错误。我似乎看不出这两种情况之间有任何明显的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多