Вопрос по c++, private-members, string – Объявление строк как std: string в C ++

2

Это основано на GCC / G ++ и обычно на Ubuntu.

Вот'моя примерная программамы сделали:

#include 

using namespace std;

int main()
{

std::string c = "Test";
cout < c;
return 0;
}

Ваш Ответ

4   ответа
3

Первая проблема:

Прежде всего, вам не хватает#include  директивы. Вы не можете полагаться на другие заголовки (такие как) чтобы#include  заголовок автоматически. Помимо этого:

Вторая проблема:

Запись строкового объявления как std: string также работает нормально. Какие'Разница

Это потому, что у вас есть (зло)using директива в области глобального пространства имен:

using namespace std;

Эффект этой директивы заключается в том, что все имена изstd пространство имен импортируется в глобальное пространство имен. Вот почему полностью квалифицированныйstd::string и неквалифицированныйstring разрешить к тому же типу.

Если вы пропустили этоusing namespace std; директива, вы получите ошибку компилятора при использовании неквалифицированногоstring название.

Третья проблема:

Если я использую эту std :: string в классе для объявления закрытой переменной, я получаю сообщение об ошибке:станд» не называет тип. Пример этого объявления:

Вы пропустили двоеточие. Которые должны быть:

std::string
//  ^

И не

std:string
// ^
@itsols: Осторожно, цитата немного отличается от той, что, по-видимому, подразумевает ваша выдержка;)симена отstd пространство имен, которое импортируется в глобальное пространство имен. Причина, по которой это плохо, заключается в том, что вы можете получить конфликт имен между именами, которыепринадлежать в глобальное пространство имен и имена, которыеимпортный в глобальное пространство имен. Andy Prowl
Вы сказали:namespace are imported into the global namespace, Так почему это плохо? Простите за невежество;) И приятные объяснения +1 itsols
2

Запись строкового объявления как std: string также работает нормально. Какие'Разница

Там нет никакой разницы, если вы не объявите что-то еще называетсяstring, В вашем кодеstring а такжеstd::string относятся к тому же типу. Но избегайтеusing namespace std Любой ценой.

Если я использую эту std :: string в классе для объявления закрытой переменной, я получаю сообщение об ошибке:станд» не называет тип. Пример этого объявления:

Вам нужно#include  для того, чтобы использоватьstd::string, Что происходит в том, что в вашем первом примере кода, кажется в том числе, Вы не можете полагаться на это. Вы должны включить.

@MikeSeymour не беспокойся. Я думаю, что теперь все отсортировано. juanchopanza
Извините, я случайно отредактировал это вместо моего собственного ответа. Mike Seymour
@juanchopanza Хороший:There is no difference, unless you declare something else called string, И тут появился свет :) +1 itsols
12

Запись строкового объявления как std: string также работает нормально. Какие'Разница

Разница будет немного яснее, если вы отформатируете ее по-другому:

std:
    string c = "Test";

Вы'объявляяэтикетка называетсяstdи используя имяstring который был сброшен в глобальное пространство именusing namespace std;, Правильно писать какstd::string, вы'повторное использование имениstring отstd Пространство имен.

Если я использую этоstd::string внутри класса для объявления закрытой переменной я получаю сообщение об ошибке:‘std’ does not name a type.

Тот'потому что ты можешьпоставить метку в определении класса, только в блоке кода. Вы'Я должен написать это правильно, какstd::string там. (Если класс определен в заголовке, тоusing namespace std это даже хуже, чем в исходном файле, поэтому я призываю вас не делать этого.)

Кроме того, если выповторное использованиеstd::stringтогда вы должны#include , Похоже, ваш код работает случайно из-за тянет больше определений, чем нужно, но вы можетет переносно полагаться на это.

Этот пример, если яотформатировал это по-другому это просто красиво. Спасибо! Имеет много смысла :) itsols
5

Вам необходимо включить заголовок класса строки:

#include 

В этом коде есть опечатка, пропущено второе двоеточие

std:string N;

должно быть:

std::string N;

С одним двоеточием он становится меткой для goto, что, вероятно, не то, что вы имели в виду.

Это не былот опечатка. Скорее этоТо, что я думал, было правильно, как это работало раньше в первом примере. Но теперь я вижу, чторазница после 'Mike-Seymourобъяснение. Спасибо, что нашли время! itsols
@ Matt-Petersson спасибо за ваш вклад. Я попробовал это, но это было то же самое. И это работает в первом примере. Так что я неПонять, зачем нужна строка для второго :( itsols

Похожие вопросы