2012-06-08 3 views
-1

У меня есть класс Bar:Пользовательский объект класса в списке инициализации

class Bar 
{ 
public: 
Bar(void); 
~Bar(void); 
}; 

и класс Foo, который получает ссылку на Bar объект в качестве параметра конструктора и нужно, чтобы сохранить его в частном члена bar_:

class Foo 
{ 
private: 

Bar& bar_; 
public: 
Foo(Bar& bar) : bar_(bar) {} 
~Foo(void) {} 
}; 

Это не компилируется:

Ove Функция rloaded member не найдена в 'Foo'

Отсутствует спецификатор типа - int. Примечание: C++ не поддерживает по умолчанию-ИНТ

Теперь я подозреваю, несколько вещей, которые мне нужно, чтобы гарантировать, то вторая ошибка для Bar& bar_; декларации в Foo. Нужно ли использовать явный конструктор при объявлении bar_?

Мне интересно узнать, как работает компилятор по этому вопросу, поэтому подробное объяснение будет высоко оценено.

Спасибо.

EDIT

Хорошо я отправляю новый код, так как, по-видимому, не было ничего плохого с моим кодом. Parser.h:

#pragma once 
class Parser 
{ 
private: 
std::istream& inputStream_; 
Analyzer& analyzer_; 
public: 
Parser(std::istream &inputStream, Analyzer& analyzer); 
~Parser(void); 
}; 

Parser.cpp:

#include "stdafx.h" 
#include "Parser.h" 
#include "Analyzer.h" 
Parser::Parser(std::istream &inputStream, Analyzer& analyzer) : inputStream_(inputStream),  analyzer_(analyzer) {} 

Parser::~Parser(void) {} 

Analyzer.h:

#pragma once 
class Analyzer 
{ 
public: 
    Analyzer(void); 
    ~Analyzer(void); 
}; 
+1

Что такое 'Parser'? –

+1

Код в порядке (помимо отсутствующих определений c-tor и d-tor бара), в сообщении об ошибке упоминается 'Parser' - что это такое? – jrok

+0

Это компилирует - http://ideone.com/caFF2 –

ответ

1

Это не компилируется:

overloaded member function not found in 'Foo'  
missing type specifier - int assumed. Note: C++ does not support default-int 

Фрагмент кода, который вы предоставили, действительно скомпилирован. Я могу рассказать вам немного об этих ошибках.

Первое сообщение об ошибке происходит при компиляции метода с таким же именем, но с другой подписи из методов, объявленных с тем же именем в вашем классе. Например, если у вас были:

class A { 
public: 
    int foo (int); 
}; 

int A::foo() { return 0; } 

Компилятор выдаст ошибку об отсутствии перегрузки функции-члена Компилятор считает, что foo перегружен, потому что foo(void) отличается от foo(int).

Вторая ошибка возникает, когда вы определяете переменную или функцию без типа. Обычно это не проблема, а следствие какой-то другой проблемы.Например, если ваш код пытался использовать класс, прежде чем он был объявлен, как:

B b; 
class B {}; 

Вы бы получить вторую ошибку об отсутствии спецификатор типа, но это говорит о B на первой линии.

Смежные вопросы