0

理解しようとしているこの C++ スニペットがあります。

.hh ファイル:

class A
{
private:
    //recordDelimiter is a '+' character
    // I can do this because char is an integral type!
    static const char recordDelimiter = '+';

    void f()
    {
        ....
        //serializedData is a std:;string
        //Get number of times A::recordDelimiter is found i.e. Number of objects

        // Non-Functional
        int times = (int) std::count (serializedData.begin(), serializedData.end(), A::recordDelimiter);

        // Functional
        const char recDel = A::recordDelimiter;
        int times = (int) std::count (serializedData.begin(), serializedData.end(), recDel);

        // Functional
        int times = (int) std::count (serializedData.begin(), serializedData.end(), '+');

        ....
    }
};

std::count 参照から、これは関数のシグネチャです。

template <class InputIterator, class T>
  typename iterator_traits<InputIterator>::difference_type
    count (InputIterator first, InputIterator last, const T& val)

A::recordDelimiterそのため、代わりに使用することが問題になる理由がわかりません'+'。コンパイルすると undefined reference toA::recordDelimiterが得られます'`

私の質問は基本的に、なぜ上記の機能しないコードが機能しないのですか? そして、どうしてこれをするのですか:

const char recDel = USerializer::recordDelimiter; 

それを std::count に渡しますか?

4

2 に答える 2

2

を宣言しましたが、定義していませんA::recordDelimiter。次の行を 1 つのソース コード ファイルに追加します。

const char A::recordDelimiter;

static const メンバーを初期化するが定義しないというショートカットは、値を提供すると考えることができますが、メンバーの実際のオブジェクトではありません。したがって、これは理にかなっています:

char foo = A::recordDelimiter; // just substitute '+' for the rhs here

しかし、これはそうではありません:

char *foo = & A::recordDelimiter; // Oops, no such object, so it can't have an address

質問の場合、パラメータとして astd::countを受け入れconst T&ます。オブジェクトは宣言されているが定義されていないため、存在しません。したがって、存在しないオブジェクトへの参照をバインドしても意味がありません。

明確にするために、ここで初期化子を提供し、オブジェクトを定義しないことは合法です。ただし、そのような宣言され初期化されているが定義されていないオブジェクトのアドレスを取得したり、参照にバインドしたりすることはできません。

于 2013-01-29T20:13:38.667 に答える
2

ああ!A::recordDelimiter を宣言しましたが、定義していません。これはヘッダーファイルにありますか?その場合、対応する定義をソース ファイルに追加する必要があります。

于 2013-01-29T20:13:47.700 に答える