Почему компилятор не показывает ошибку с этими типами возврата? - PullRequest
0 голосов
/ 05 ноября 2011

Запуск стандартной установки Ubuntu 11.10 с последней версией NetBeans.У меня что-то похожее на следующее:

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 он компилируется без проблем.Я не знал, что это можно сделать, так как я впервые сталкиваюсь с этим делом.Я снова прошу прощения за то, что потратил впустую ваше время, и я ценю, что вы пытаетесь мне помочь.

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Вы не показали свой реальный код;пример, который вы нам привели, не компилируется (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'

Но то, что вы описываете, может произойти, когда у вас есть конверсии или приведение типов.Вы должны показать свой реальный код (или упрощенный код, который демонстрирует симптомы), чтобы получить реальную помощь.

1 голос
/ 05 ноября 2011

После исправления ошибок в не-тестовом случае мой компилятор выдает ошибку .

Ваше утверждение о том, что Type1 и Type2 не связаны, должно быть ложным.

В следующий раз позаботься о реальном тесте.

...