Эффективный пример пункта 3 С++

Мой вопрос касается конкретного пункта (3) книги "Эффективный C++". В книге приведен этот пример, который я попытался воспроизвести как можно ближе к C++ 2010 года (включая iostream и строку):

class TextBlock {
public: 
    const char& operator[](std::size_t pos) const
    {
        return text[pos]; 
    }
    char& operator[](std::size_t pos)
    { 
        return text[pos]; 
    }

private: 
    std::string text;
};

void print(const TextBlock& ctb)
{
    std::cout << ctb[0]; // OK
    //ctb[0] = ‘A’; // Not OK – compiler error
}

int _tmain(int argc, _TCHAR* argv[])
{
    TextBlock tb(“Hello”);
    std::cout << tb[0];
    tb[0] = ‘x’; // OK because return has &, not const
    const TextBlock ctb("World");
    std::cout << ctb[0];
    return 0;
}

And I get these compiling errors:

1>c:\users\lalancelot\documents\visual studio 2010\projects\item3\item3.cpp(31): error C2065: '“Hello”' : undeclared identifier
1>c:\users\lalancelot\documents\visual studio 2010\projects\item3\item3.cpp(33): error C2065: '‘x’' : undeclared identifier
1>c:\users\lalancelot\documents\visual studio 2010\projects\item3\item3.cpp(34): error C2664: 'TextBlock::TextBlock(const TextBlock &)' : cannot convert parameter 1 from 'const char [6]' to 'const TextBlock &'
1>          Reason: cannot convert from 'const char [6]' to 'const TextBlock'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous

Позвольте мне сначала сказать, что я разочарован тем, что уже застрял на этой ранней стадии книги. Я как-то нашел здесь информацию:
разница между static_cast‹ const A›(*this) и static_cast‹const A&›(*this),
, но не рабочий ответ, как в книге. Я хотел бы, чтобы пример книги работал, чтобы я мог понять, как он работает. Я застрял на этом уже много дней, и я должен признать, что мне нужна помощь. Я хотел бы знать, не хватает ли мне здесь базовой концепции или я не в себе. Спасибо.


person Pierre Lalancette    schedule 10.09.2012    source источник
comment
Re: ваши первые 2 ошибки; ваши кавычки шаткие, они должны быть обычными двойными кавычками пишущей машинки ", но, похоже, это не так.   -  person Joachim Isaksson    schedule 10.09.2012
comment
Совершенно ясно, что этот код в книге неполный, в определении класса есть части '...'. Автор книги «Эффективный C++» упоминает, что желательно, чтобы это была вторая книга, прочитанная при изучении C++. Если вы только начинаете изучать язык, вероятно, будет лучше найти другую книгу и вернуться к эффективному C++ позже.   -  person Jan Wrobel    schedule 10.09.2012
comment
Это не первая моя книга по С++, Ян, но я не очень много программировал на С++. Раньше я работал на питоне и хочу углубиться. Я хотел бы сказать, что я готов к этому, но сказать вам правду, я понятия не имею, готов ли я. Спасибо за цитату, предупреждающую Иоахима.   -  person Pierre Lalancette    schedule 11.09.2012


Ответы (2)


Какие цитаты вы используете? Я спрашиваю, потому что, когда я смотрю на ваш код, я вижу отдельные открывающие и закрывающие кавычки, а когда я копирую/вставляю его в свой редактор, это указывает, что это открывающие и закрывающие кавычки Unicode. Все знаки пунктуации в программе на C++ должны быть чистыми ASCII: 0x22 для двойных кавычек (как открывающих, так и закрывающих) и 0x27 для одинарных кавычек. Это также то, что должны давать вам соответствующие символы на клавиатуре при вводе текста в программном редакторе. (Не используйте текстовый процессор для ввода кода.)

person James Kanze    schedule 10.09.2012
comment
Спасибо, причина в моей французской клавиатуре. Теперь буду искать тех. - person Pierre Lalancette; 11.09.2012
comment
@PierreLalancette Попытка написать C ++ с французской клавиатурой - это боль. Я бы посоветовал вам загрузить драйвер клавиатуры для США и активировать его при редактировании программ. (Windows очень хороша в этом. Я настроил свою машину так, что ALT-1 дает мне США, ALT-2 французский, ALT-3 немецкий и ALT-0 все, что выгравировано на колпачках клавиш. Я сделал то же самое под Solaris в прошлом.) - person James Kanze; 11.09.2012
comment
Не волнуйтесь, у меня есть переключатель Alt-Shift между английским и французским языками. Просто я не знал о проблемах, которые это может вызвать. Я привык программировать на английском, просто надо быть еще внимательнее. - person Pierre Lalancette; 12.09.2012
comment
@PierreLalancette Я все еще удивлен, что проблема должна быть в клавиатуре, а не в редакторе. Французские клавиатуры, которые я использовал, посылают 0x22, когда я ввожу 3 без сдвига. Однако некоторые текстовые процессоры (включая MS-Word в определенных конфигурациях) определяют, является ли этот символ открывающей или закрывающей кавычкой, и изменяют его, даже по-английски. При работе с текстом открывающие и закрывающие кавычки — это разные символы. - person James Kanze; 13.09.2012
comment
Я настроил переключение языка и клавиатуры с помощью alt-shift. На самом деле это вопрос размещения (канадского) французского письма со всеми правильными положениями клавиш. Я пробовал много конфигураций, и это та, которая соответствует конфигурации, к которой мы привыкли, и которую использует большинство людей здесь. На самом деле это не проблема, так как я (и всегда должен) программировать с английской клавиатурой и языком. - person Pierre Lalancette; 14.09.2012

Класс TextBlock нуждается в конструкторе, который можно построить из текста:

explicit TextBlock( const std::string& s ) : text( s )
{
}

Может быть, есть веб-сайт книги, где вы можете найти исправления к книге.

person Torsten Robitzki    schedule 10.09.2012
comment
Да! Это та часть, которую мне не хватало. По какой-то причине я подумал, что создание строки было частью overide оператора []. Я был так неправ. Большое спасибо. - person Pierre Lalancette; 11.09.2012
comment
О, и я просмотрел опечатки в книге. Они говорят только о том, что значение 'pos' должно быть константой. Ничего больше. - person Pierre Lalancette; 11.09.2012