ошибка: использование typedef-name после класса - PullRequest
3 голосов
/ 22 сентября 2010

Я не могу понять, что на самом деле проблема с этим.

typedef struct _actor
{
   ...
} _actor, Actor;

class Actor
{
   ...
};

Я получаю это странное сообщение об ошибке actor.cpp:31: error: using typedef-name ‘Actor’ after ‘class’.

Есть идеи, что я здесь не так сделал? Спасибо:)

Ответы [ 3 ]

4 голосов
/ 22 сентября 2010

Чтобы понять, что происходит, нам нужно разбить первое утверждение на части:

struct _actor 
{ 
   ... 
};

typedef struct _actor _actor;
typedef struct _actor Actor; 

Сначала мы создаем структуру с именем _actor. Затем мы создаем typedef для struct _actor с именем _actor. Это полезно только в C. Это позволяет нам сказать:

  _actor myActor;

вместо

 struct _actor myActor;

Но в C ++ это не нужно, поскольку C ++ позволяет нам использовать первую форму без использования typedef.

Третья строка создает второй typedef для struct _actor с именем Actor. Затем, когда вы пытаетесь создать класс с именем Actor, компилятор жалуется, так как это имя уже используется для псевдонима для структуры.

Теперь представляется вероятным, что в исходном коде C автор намеревался struct _actor быть просто подробностью реализации, и что вы всегда будете использовать просто Actor для ссылки на экземпляры этой структуры. Следовательно, в вашем коде C ++ вы, вероятно, должны полностью исключить typedef и просто переименовать структуру. Тем не менее, это даст вам:

 struct Actor {.....}
 class  Actor {.....}

Итак, возможно, вам стоит заняться объединением этих двух классов.

4 голосов
/ 22 сентября 2010

Вам не разрешено определять символ Actor более одного раза. Оператор typedef уже определяет символ Actor как псевдоним для struct _actor, прежде чем пытаться объявить класс с тем же именем.

Полагаю, вы используете компилятор gcc. Я получаю следующие ошибки при компиляции с gcc:

../src/main.cpp:113: error: using typedef-name ‘Actor’ after ‘class’
../src/main.cpp:111: error: ‘Actor’ has a previous declaration here

В первом сообщении (указывающем на строку class Actor в программе) говорится, что вы не можете объявить класс с typedef-name (Actor уже объявлено с использованием typedef). Второе сообщение (указывающее на строку typedef struct _actor в программе) немного яснее и ссылается на несколько объявлений для Actor.

В C / C ++ очень часто встречается один и тот же класс ошибок, приводящий к множественным ошибкам компилятора, и часто более полезное сообщение не первое сообщаемое.

0 голосов
/ 19 сентября 2016

для принтера Arduino Hectop 3D:

Переименуйте fpos_t переменные в SdBaseFile.h и SdBaseFile.cpp в другое имя, например fpos_t1, и перекомпилируйте.

...