我的程序使用Random
类来管理生成器类型,并提供模板化函数以使用给定生成器返回分布。但是,当我编译它时,我总是得到未定义的引用错误。
为了说明问题,我创建了一个简单的程序,其中包含一个Random
类,它只提供一个模板化函数Random::f()
,它返回一个正态分布的数字:
#include <random>
#include <iostream>
class Random
{
public:
template <typename T>
static T f()
{
std::normal_distribution<T> distribution(0,1);
return distribution(generator);
}
static std::default_random_engine generator;
};
int main()
{
std::cout << Random::f<double>();
return 0;
}
当我使用gcc 4.9.2
编译时,我得到:
quant@900AX:~/Documents$ echo $CC /usr/bin/gcc-4.9 quant@900AX:~/Documents$ $CXX -std=c++11 main.cpp /tmp/ccWCPiN7.o: In function `double Random::f<double>()': main.cpp:(.text._ZN6Random1fIdEET_v[_ZN6Random1fIdEET_v]+0x2b): undefined reference to `Random::generator' collect2: error: ld returned 1 exit status
为什么我收到此错误?
答案 0 :(得分:3)
类声明中的静态数据成员声明不是它们的定义。
为generator
提供一个定义作为静态变量。
std::default_random_engine Random::generator = std::default_random_engine();
答案 1 :(得分:3)
将定义排除在课堂之外:
std::default_random_engine Random::generator;
您编写的代码,只需声明成员对象,您必须为其编写定义。