2013-08-05 6 views
7

В C мы должны использовать префикс структуры всякий раз, когда хотим объявить или определить структуру. Тем не менее, все изменилось после того, как структура стала своего рода классом в C++. Когда мы объявляем структуру, нам больше не нужно использовать префикс struct. В этом ключе, я думаю, что тег структуры в C стал названием типа в C++.Я не могу понять объявление структуры в C++

Однако это не означает, что мы не можем использовать префикс struct. Мы все еще можем использовать префикс struct. Например, Bjarne Stroustrup, создатель C++, представляет пример объявления структуры как с префиксом struct, так и без него, что вызывает у меня недоумение.

Ниже приведены определения структуры, которые пытаются создать структуру с аргументом шаблона T. Они компилируются в точности без ошибок.

template<class T> struct linked_list { 
    T element; 
    linked_list<T> *next; 
}; 
template<class T> struct linked_list { 
    T element; 
    struct linked_list<T> *next; 
}; 

Ниже представлены объявления функций, тип возвращаемого типа и тип аргумента которых являются структурами. Даже если это не то, что отличается от вышесказанного, первый один из ниже двух объявлений функций, то одна с префиксом STRUCT, дает мне ошибку с Visual Studio C++ 2012

template<class T> struct linked_list<T> *add_list(T element, struct linked_list<T> *tail); 
template<class T> linked_list<T> *add_list(T element, linked_list<T> *tail); 

Я действительно не понимаю, как все работает. Я не понимаю различий между этими декларациями. Может ли кто-нибудь дать мне подробное объяснение?

+1

Вы спрашиваете, почему вы можете опустить ключевое слово 'struct' в C++? [Почему C требуется ключевое слово «struct», а не C++?] (Http://stackoverflow.com/questions/8422775/why-does-c-need-struct-keyword-and-not-c) – Blastfurnace

+0

Какой вы компилятор с помощью? Не все C++ соответствуют стандартам. – Anycorn

+1

@Blastfurnace Спасибо. Однако у меня все еще есть вопрос. Ссылка, которую вы мне дали, говорит, что если нет двусмысленности, то C++ «допускает» отсутствие ключевого слова struct. Это означает, что мы все еще можем использовать ключевое слово struct. Затем следует, что в моих вторых кодах есть двусмысленность, потому что это дает мне ошибку. Однако я не вижу никакой двусмысленности. Что не так? – isbae93

ответ

4

За исключением случаев, когда C, в C++, ключевое слово structclass) может быть опущено, если нет скованности. Если есть двусмысленность, вам все равно придется использовать ключевое слово struct. Известным примером является POSIX 'stat: есть struct stat и функция stat. Здесь вам всегда нужно использовать struct stat для обозначения типа.

-1

Вы действительно хорошо понимаете, как сами объясняете. В C++ ключевое слово struct такое же, как и класс ключевого слова, но со значением по умолчанию для публичных, а не для частных членов. Итак, объявив класс, используя ключевое слово struct, вы не используете его снова, ссылаясь на этот класс. Кажется, вы пытаетесь использовать struct, поскольку он будет использоваться в C в первом примере. Для C++ это совсем другое.

+0

Итак, вы в основном подвела его вопрос – jrok

+0

Однако возможно, что мы используем префикс структуры даже после определения структуры. Мы можем видеть это в моем первом коде. Это так сложно. :-( – isbae93

+0

Это не очень сложно, C++ - это другой язык для C. Ключевое слово struct означает что-то другое. Objective-C является расширением C, поэтому все C остаются в силе, но Stroustrup решил не поддерживать такую ​​нисходящую совместимость при разработке C++. –

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