Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用VS 2010编译时模板重新定义错误_C++_Visual Studio 2010 - Fatal编程技术网

C++ 使用VS 2010编译时模板重新定义错误

C++ 使用VS 2010编译时模板重新定义错误,c++,visual-studio-2010,C++,Visual Studio 2010,我遇到了某种模板重新定义错误。这不是一个破坏解决方案的错误(我已经找到了解决方法),但我仍然想理解代码为什么是错误的 template <typename RandomEngine, typename RandomDistribution = std::uniform_int_distribution<int> > struct base_random_generator { RandomEngine generator; RandomDistributi

我遇到了某种模板重新定义错误。这不是一个破坏解决方案的错误(我已经找到了解决方法),但我仍然想理解代码为什么是错误的

template <typename RandomEngine, typename RandomDistribution = std::uniform_int_distribution<int> >
struct base_random_generator {
    RandomEngine generator;
    RandomDistribution distribution;
    base_random_generator(RandomEngine gen, 
                          RandomDistribution dist = RandomDistribution(0, 10))
        : generator(gen), distribution(dist) { }
    int operator()() {
        return distribution(generator);
    }
};

base_random_generator< std::mt19937 >
create_mt_generator(std::mt19937::result_type seed = std::mt19937::default_seed) {
    return base_random_generator< std::mt19937 > (std::mt19937(seed));
}
模板
结构基随机生成器{
发电机;
随机分布;
基本随机发生器(随机发动机发电机,
随机分布距离=随机分布(0,10))
:生成器(gen),分配(dist){
int运算符()(){
回流分配(发电机);
}
};
基本随机发生器
创建\u mt\u生成器(std::mt19937::result\u type seed=std::mt19937::default\u seed){
返回基随机生成器(std::mt19937(seed));
}
Visual Studio 2010未能编译上述代码,出现以下错误:

。。。已在main.obj中定义

致命错误LNK1169:找到一个或多个多重定义符号

但是,如果删除create_mt_generator函数,错误就会消失,一切又恢复正常。 我的主要想法是能够传递一个行为类似于std::function的结构,这样我就可以反复调用它以获得一个随机整数

该函数如下所示:

template <typename Container, typename RandomGenerator>
void scramble(Container c, RandomGenerator rand) { }
模板
无效置乱(容器c,随机生成器rand){}

我认为需要能够使用用户给定的参数动态创建一个随机生成器类。

头文件中只应定义某些类型的函数:

  • inline
  • 模板
  • static

在所有其他情况下,只将定义放在一个编译单元中,并在头文件中使用前向声明(原型)使其对其他编译单元可见。

您的
create\u mtu generator
函数返回一个模板对象,但它不是模板函数,因此需要在头文件之外有一个home。如果要将其保留在标题中,可以将其声明为
内联
(或
静态
)。