2

私の質問は、書籍「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

最初に言っておきますが、この本の初期段階ですでに立ち往生していることに落胆しています。私はどういうわけかここで情報を見つけました:
static_cast<const A>(*this) と static_cast<const A&>(*this) の違いです
、本のような実用的な答えではありません。本の例を機能させて、それがどのように機能するかを理解できるようにしたいと思います。私はこれで何日も立ち往生しており、助けが必要であることを認めなければなりません. ここで基本的な概念が欠けているのか、それとも頭がおかしいのか知りたいです。ありがとう。

4

2 に答える 2

6

どのような引用符を使用していますか? あなたのコードを見ると、開始引用符と終了引用符がはっきりしていて、それをエディターにコピーして貼り付けると、それらが Unicode の開始引用符と終了引用符であることがわかるからです。 C++ プログラムのすべての句読点は純粋な ASCII である必要があります。二重引用符 (開始と終了の両方) は 0x22、単一引用符は 0x27 です。これは、プログラム エディターでテキストを入力するときに、キーボード上の対応する文字が提供するものでもあります。(コードの入力にワープロを使用しないでください。)

于 2012-09-10T18:15:48.443 に答える
2

クラス TextBlock には、テキストから構築できるコンストラクターが必要です。

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

本の訂正箇所を検索できるウェブサイトがあるかもしれません。

于 2012-09-10T18:06:07.763 に答える