Почему это не инициализируется правильно? - PullRequest
0 голосов
/ 27 апреля 2011

Я пытаюсь инициализировать конструктор класса в другом конструкторе.GCC выдает ошибку: «Тип« foo »не имеет оператора вызова». Этот псевдо-код должен объяснить мои намерения.

class foo {  
    type arg1, arg2;
    foo (type _arg1, type _arg2) {  
        _arg1=arg1;  
        _arg2=arg2;  
    }  
}

class foo2 {  
    foo member;

    foo2(type _arg1, type _arg2) {  
        member(_arg1, _arg2);  
    }  
}

Ответы [ 5 ]

5 голосов
/ 27 апреля 2011

Два выпуска:

Во-первых, ваш конструктор foo должен быть публичным, как указано в ответе Марка.

Во-вторых, чтобы инициализировать элемент его конструктором, вы должны использовать следующий синтаксис:

foo2(type _arg1, type _arg2) :
   member(_arg1, _arg2)
   { /* code */ }  
0 голосов
/ 27 апреля 2011

Псевдокод может объяснить ваше намерение, но он не объясняет вашу ошибку, поскольку он не ошибается так, как вы описываете:

class foo {  
    type arg1, arg2;
    foo (type _arg1, type _arg2) {  
        _arg1=arg1;  
        _arg2=arg2;  
    }  
}

class foo2 {  
    foo member;

    foo2(type _arg1, type _arg2) {  
        member(_arg1, _arg2);  
    }  
}

Хотя он дает полезную диагностику:

gcc -Wall junk.cc 
junk.cc: In constructor ‘foo2::foo2(int, int)’:
junk.cc:12:32: error: no matching function for call to ‘foo::foo()’
junk.cc:3:5: note: candidates are: foo::foo(int, int)
junk.cc:1:11: note:                 foo::foo(const foo&)
junk.cc:13:28: error: no match for call to ‘(foo) (int&, int&)’
junk.cc: At global scope:
junk.cc:14:5: error: expected unqualified-id at end of input

Что показывает, что вы не должны публиковать здесь "подобный Сорта" код и ожидать полезного ответа.

0 голосов
/ 27 апреля 2011

Вы хотите список инициализатора:

foo2(type _arg1, type _arg2) : member(_arg1,_arg2) { }
0 голосов
/ 27 апреля 2011

Вы пытаетесь использовать конструктор member. Вы должны сделать это в списке инициализатора, а не в теле конструктора, т.е.

foo2(type _arg1, type _arg2)
    : member(_arg1, _arg2)
{  
}  
0 голосов
/ 27 апреля 2011

Ваши конструкторы не являются публичными; по умолчанию все в классе является частным, если не указано иное. Я не уверен, что это объясняет ваше точное сообщение об ошибке.

...