2014-05-06 2 views
3

Я честно смущен. Я должен спросить, но я застрял на этом.Не могу получить композицию правильно

#include <iostream> 
using namespace std; 

class Obj 
{ 
}; 


class Test 
{ 
private: 
    Obj a; 

public: 
    Test(Obj _a) 
    : a(_a) 
    {} 
}; 


int main() { 

    Obj ob(); 
    Test t(ob); 

    return 0; 

}

Я получаю эту ошибку:

t.cpp:24: error: no matching function for call to ‘Test::Test(Obj (&)())’ 
t.cpp:15: note: candidates are: Test::Test(Obj) 
t.cpp:10: note:     Test::Test(const Test&) 

Я не понимаю. Тот же фрагмент отлично работает со встроенными типами (целые числа и прочее).

+2

Это "самый раздражающий синтаксического анализа". –

+0

Возможный дубликат [Most vexing parse (C++)] (http://stackoverflow.com/questions/5926103/most-vexing-parsec) –

+0

Не нужно смущаться, они называют это «досадой» по какой-то причине. –

ответ

4

Obj ob(); объявляет ob функцией, не требующей параметров и возвращающей Obj.

Если вы хотите построить по умолчанию Obj, используйте Obj ob; или Obj ob{};.

2

Эта линия

Obj ob(); 

не создает объект ob. Он объявляет функцию, которая ничего не принимает в качестве ввода и возвращает Obj.

Изменить это:

Obj ob; 
Смежные вопросы