2015-08-19 2 views
-3

Как инициализировать ptype2 для копирования структуры ptype3 (тип-преобразование)?Копировать конструктор с разной структурой в C++

typedef struct PType2 { 
    double x, y; 

    PType2() : x(0), y(0) {} 
    PType2(const PType3 & ptype3) : x(ptype3.x), y(ptype3.y) {} //Abort ptype3.z to create a two-dimensional point 
    PType2(double xy) : x(xy), y(xy) {} 
    PType2(double x, double y) : x(x), y(y) {} 
} ptype2; 

Выход:

error C2065: 'ptype3' : undeclared identifier 
error C2143: syntax error : missing ',' before '&' 
error C2228: left of '.a' must have class/struct/union 
error C2228: left of '.b' must have class/struct/union 
error C2664: 'PType2::PType2(const PType2 &)' : cannot convert argument 1 from 'ptype3' to 'const int' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

У меня есть два typedef struct, ptype2(double x, double y) и ptype3(double x, double y, double z).

Перегрузка оператора присваивания может решить проблему?

+3

'PType2 (const PType3 & ptype3)' не является конструктором копирования. –

+0

Был ли «PType3» определен перед «PType2»? – CoryKramer

+2

Какой компилятор вы используете? Почему вы пытаетесь запустить комментарий с помощью '#'? Как определяется «PType3»? – skyking

ответ

1

Компилятор не может найти PType3. Прямой декларации здесь недостаточно, так как вы хотите получить доступ к элементам PType3 в PType2.

Вы можете, однако, реализовать конструкторы после определения PType3, тогда объявление будет делать трюк.

struct PType3; 
struct PType2 { 
    double x, y; 

    PType2() : x(0), y(0) {} 
    PType2(const PType3 & ptype3); 
    PType2(double xy) : x(xy), y(xy) {} 
    PType2(double x, double y) : x(x), y(y) {} 
}; 

struct PType3 { 
    double x, y; 

    PType3() : x(0), y(0) {} 
    PType3(const PType2 & ptype2) : x(ptype2.x), y(ptype2.y) {} 
    PType3(double xy) : x(xy), y(xy) {} 
    PType3(double x, double y) : x(x), y(y) {} 
}; 

И в CPP:

PType2::PType2(const PType3 & ptype3) : x(ptype3.x), y.(ptype3.y) {}; 
1

Подпись для копирования конструктора:

T(const&T t); 

, и вы не имеете его в вашем коде.

Если вы хотите построить PType2 с PType3, вы должны определить PType3 до PType2.

0

Прежде всего PType2(const PType3 & ptype3) официально не называется конструктором копирования. С точки зрения C++ это PType2(const PType2 &).

Я думаю, что вам не хватает заголовочного файла, который определяет класс PType3.

Сказав, что предоставленные вами ошибки точно не соответствуют коду. Вы модифицировали код перед вставкой в ​​stackoverflow?

0

Обычно я предлагаю прочитать сообщения об ошибках, но в этом случае они немного запутывают. Я полагаю, проблема заключается в том, что вы не определили PType3 до PType2, она должна быть полностью определена, когда вы пытаетесь получить доступ к ее членам (поэтому простое декларацию не будет делать).

Сообщение об ошибке похоже на компилятор, который поддерживает дефолт на int. Первая ошибка в этом случае, потому что компилятор видит PType3, и поскольку он еще не объявлен, он не является типом, поэтому компилятор предполагает, что он должен по умолчанию int, поэтому он считает, что PType3 - это имя вашего параметра. Затем он запутывается и также смущает пользователя (используя неинтуитивное упорядочение ошибок).

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