Почему компилятор не показывает ошибку с этими типами возврата?

#c #function #compiler-errors #return-type

#c #функция #ошибки компилятора #возвращаемый тип

Вопрос:

Запуск установки 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;
}
  

ПРАВКА2:

Я прошу прощения за мой плохо сформулированный вопрос и пример. В будущем я буду более осторожен с примерами. Я работал чуть более 10 часов и потерял фокус. Следующий пример воспроизводит мой случай:

 #include <map>

using std::map;

class Node {

};

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

class HMM {
    public:
        HMM(const Networkamp; 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 он компилируется без проблем. Я не знал, что это можно сделать, поскольку я впервые сталкиваюсь с этим случаем. Еще раз прошу прощения, если я потратил ваше время впустую, и я ценю, что вы пытаетесь мне помочь.

Комментарии:

1. Являются ли «некоторые параметры» и «некоторые параметры» опечаткой? Или пропущенная точка с запятой? Являются ли они частью вопроса? Пожалуйста, представьте свой реальный тестовый пример, чтобы нам не пришлось тратить наше драгоценное время на догадки.

2. Моя ошибка. Отредактирует некоторые параметры. Они не важны для случая. Прошу прощения за путаницу.

3. Возможно, Type1 и Type2 не так несвязаны, как вы думаете. Пожалуйста, опубликуйте их объявления (по крайней мере, их конструкторы и операторы присваивания)

4. вы на самом деле вызываете и используете RunAlgo(…)?

5. @Morat: по крайней мере, попробуйте свои образцы. Вы пропускаете ; в конце объявлений класса. И даже при этом GCC отклоняет код: error: conversion from ‘Network’ to non-scalar type ‘HMM’ requested .

Ответ №1:

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

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

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

Ответ №2:

Вы не показали свой фактический код; приведенный вами пример не компилируется (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. Он / она уже должен работать с упрощенным фрагментом кода (или «тестовым кейсом») как часть базовых основ отладки .

2. Классы слишком большие, чтобы размещать их здесь. Я попытался воспроизвести этот сценарий с помощью упрощенной версии кода, но в этом случае он выдает ошибку. Кажется, я не вижу какой-либо заметной разницы между двумя сценариями.