std :: count分隔符问题

时间:2013-01-29 20:08:21

标签: c++

我想要了解这个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 to A :: recordDelimiter'`

所以我的问题基本上就是,为什么我上面的非功能代码不起作用?怎么这样做:

const char recDel = USerializer::recordDelimiter; 

然后将它传递给std :: count工作?

2 个答案:

答案 0 :(得分: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接受const T&作为参数。由于对象已声明但未定义,因此不存在。因此,将引用绑定到不存在的对象是没有意义的。

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

答案 1 :(得分:2)

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