我想要了解这个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工作?
答案 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,但从未定义它。这是在头文件中吗?如果是这样,您需要在源文件中为其添加相应的定义。