有效的c ++第3项示例

Pie*_*tte 2 c++ effective-c++

我的问题是关于"Effective C++"一书的特定项目(3).本书给出了这个例子,我尝试尽可能接近vs 2010 c ++(包括iostream和string):

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;
}
Run Code Online (Sandbox Code Playgroud)

我得到这些编译错误:

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
Run Code Online (Sandbox Code Playgroud)

首先我要说的是,我很沮丧已经陷入了本书的早期阶段.我在这里找到了一些信息:
static_cast <const A>(*this)和static_cast <const A&>(*this)之间的区别,
但不是像书中那样的工作答案.我想让这本书的例子有用,这样我就能理解它是如何工作的.我已经被困在这一天很多天了,我必须承认我需要帮助.我想知道我是否在这里错过了一个基本概念,或者我是否已经超越了我的想法.谢谢.

Jam*_*nze 6

你用的是什么样的报价?我问,因为当我查看你的代码时,我会看到不同的开始和结束引号,当我将它复制/粘贴到我的编辑器中时,它表明它们是Unicode开启和关闭引号. C++程序中的所有标点都应该是纯ASCII:双引号(打开和关闭)的0x22,以及单引号的0x27.这也是在程序编辑器中输入文本时键盘上的相应字符应该给你的东西.(不要使用文字处理程序输入代码.)