Смотрите этот предыдущий ответ на связанный вопрос. Это длинная цитата из статьи Дэна Сакса, которая объясняет эту проблему так же ясно, как и все, с чем я сталкивался:
Разница между 'struct' и 'typedef struct' в C ++?
Техника может предотвратить реальные проблемы (хотя, по общему признанию, редкие проблемы).
Это дешевая страховка - это нулевая стоимость во время выполнения или в пространстве кода (единственная стоимость - это несколько байтов в исходном файле), но получаемая вами защита настолько мала, что редко кто-то использует ее последовательно , У меня есть фрагмент «нового класса», который включает typedef, но если я на самом деле кодирую класс с нуля без использования фрагмента, я почти никогда не удосуживаюсь (или это помните?) Добавить typedef.
Так что я бы сказал, что я не согласен с большинством представленных здесь мнений - стоит добавить эти typedef, но недостаточно, чтобы я огорчил кого-либо (включая меня) из-за того, что не вставил их.
Меня попросили привести пример того, как отсутствие определения типа typedef может привести к неожиданному поведению - вот пример, более или менее взятый из статьи Saks:
#include <iostream>
#include <string>
using namespace std;
#if 0 // change to #if 1 to get different behavior
// imagine that this is buried in some header
// and even worse - it gets added to a header
// during maintenance...
string foo()
{
return "function foo... \n";
}
#endif
class foo
{
public:
operator string() {
return "class foo...\n";
}
};
int main()
{
string s = foo();
printf( "%s\n", s.c_str());
return 0;
}
Когда объявление функции становится видимым, поведение программы незаметно меняется, поскольку между функцией foo
и классом foo
.
нет конфликта имен.
Однако, если вы включите «typedef class foo foo;
», вы получите ошибку времени компиляции вместо тихой разницы в поведении.