对std随机生成器类型的未定义引用

时间:2015-01-05 10:03:26

标签: c++

我的程序使用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

为什么我收到此错误?

2 个答案:

答案 0 :(得分:3)

类声明中的静态数据成员声明不是它们的定义。

generator提供一个定义作为静态变量。

std::default_random_engine Random::generator = std::default_random_engine();

答案 1 :(得分:3)

将定义排除在课堂之外:

std::default_random_engine Random::generator;

您编写的代码,只需声明成员对象,您必须为其编写定义。