为什么编译器不显示这些返回类型的错误?

Why doesn't the compiler show an error with these return types?

本文关键字:返回类型 错误 编译器 显示 为什么      更新时间:2023-10-16

使用最新版本的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不相关的陈述一定是错的。

你没有展示你的实际代码;你给我们的例子不编译(GCC 4.6在Debian/Sid/AMD64)

% 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'

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