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. 将此行添加到一个源代码文件中:

const char A::recordDelimiter;

初始化静态 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

在问题的情况下,std::count接受 aconst T&作为参数。由于该对象已声明但未定义,因此它不存在。因此,将引用绑定到不存在的对象是没有意义的。

需要明确的是,在这里提供初始化程序是合法的,并且永远不要定义对象。但是您不能获取这样一个声明并初始化但未定义的对象的地址,也不能将其绑定到引用。

于 2013-01-29T20:13:38.667 回答
2

啊! 您声明了 A::recordDelimiter,但从未定义它。这是在头文件中吗?如果是这样,您需要在源文件中为其添加相应的定义。

于 2013-01-29T20:13:47.700 回答