我的问题是关于“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;
}
我得到了这些编译错误:
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
首先我要说的是,我很沮丧已经陷入了本书的早期阶段。我在某种程度上找到了信息:
difference between static_cast<const A>(*this) and static_cast<const A&>(*this),
但不是像书中那样的工作答案。我想让这本书的例子有用,这样我就能理解它是如何工作的。我已经被困在这一天很多天了,我必须承认我需要帮助。我想知道我是否在这里错过了一个基本概念,或者我是否已经超越了我的想法。感谢。
答案 0 :(得分:6)
您使用什么样的报价?我问,因为当我看着你 代码,我看到不同的开始和结束引号,以及我复制/粘贴时 它进入我的编辑器,它表明它们是Unicode开放和 收盘价。 C ++程序中的所有标点符号都应该是纯粹的 ASCII:0x22表示双引号(打开和关闭)和0x27 对于单引号。这也是相应的人物 在程序中输入文本时,键盘上应该会给你 编辑。 (不要使用文字处理程序输入代码。)
答案 1 :(得分:2)
类TextBlock需要一个可以从文本构造的构造函数:
explicit TextBlock( const std::string& s ) : text( s )
{
}
也许书中有一个网站,您可以查看该书的更正。