2014-01-24 3 views
3

Может кто-нибудь сказать мне, почему компилятор сообщит об ошибке.Почему я получаю ошибку для этого кода?

class A 
{ 
private: 
int data; 
public: 
A(); 
A(A& a) { this->data = a.data; } 
}; 

void main() 
{ 
A a(); 
A b(a); 
} 

Ошибка, которую я получаю.

error C2664: 'A::A(A &)' : cannot convert parameter 1 from 
'A (__cdecl *)(void)' to 'A &' 
+2

основные возвращает Int КСТАТИ –

+7

[** раздосадовать Синтаксическая **] (http://en.wikipedia.org/wiki/Most_vexing_parse) – 0x499602D2

+0

'A A();' это объявление функции ... –

ответ

1

Для начала он должен быть int main() и во-вторых, конструктор `A() не имеет тела

Также он должен быть A a; не A a();

EDIT

еще лучше A(A& a) { this->data = a.data; } должен читать A(const A& a) { this->data = a.data; }

+0

Не должна ли вторая строка быть A b (& a)? Просто догадаться, я совершенно не знаком с C++. –

+0

@ThomasW .: Нет, это создало бы указатель. Для передачи ссылки не требуется специальный синтаксис. –

+0

@ThomasW. Неа. '& a' возвращает указатель, тип' A * 'на самом деле. Тип 'b' -' A'. Вы не можете инициализировать указатель с не указательным типом. Типы должны совпадать. Мы выполняем 'A b (a)', потому что 'b' будет инициализирован копией' a'. – 0x499602D2

9
A a(); 

Это - декларативная декларация функции, которая возвращает A и не принимает никаких аргументов. Итак, вы пытаетесь передать указатель на свой конструктор, который, конечно, не работает, поскольку такой конструктор не существует. Если вы хотите использовать конструктор по умолчанию, используйте:

A a; 

Конечно, этот конструктор не определен. Вам нужно будет добавить определение (вы только написали объявление).

В стороне; main определено для возврата int, и вы должны взять ссылку на const в своем конструкторе.

A(const A &other) : data(other.data) {} 
+0

Это называется« Most Vexing Parse ». –

+0

@JohnDibling: не« Самый Vexing Parse ». Просто «Vexing Parse». Большинство Vexiing Parse: A a (A()); – Nawaz

-1

Попробуйте это:

class A 
{ 
public: 
    int data; 
public: 
    A(){this->data = 0;} 
    A(A& a) { this->data = a.data; } 
}; 

int main() 
{ 
    A a; 
    A b(a); 
} 

В Main, заявление

A a(); 

было изменено на:

A a; 

, потому что компилятор пытался распознать скобку как оператора, который не ист. Конструктор «default» был изменен, потому что компоновщик не распознал, что этот символ использовался. Вы можете переопределить это поведение, программируя в базовом классе, который использует поле данных в его конструкторе.

+2

Компилятор не думал, что это оператор *, он анализировал его как объявление функции без аргументов и возвращал тип 'A'. – 0x499602D2

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