使用vs2010编译时模板重新定义错误

Template re-definition error when compiled with VS 2010

本文关键字:定义 错误 新定义 编译 vs2010 使用      更新时间:2023-10-16

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

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));
}

Visual Studio 2010编译上述代码失败,出现以下错误:

…已经在main.obj

中定义

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

如果我删除create_mt_generator函数,然而,错误消失了,一切又好了。我的主要想法是能够传递一个行为类似std::函数的结构体,这样我就可以一次又一次地调用它来获得一个随机整数。

这个函数看起来是这样的:

template <typename Container, typename RandomGenerator>
void scramble(Container c, RandomGenerator rand) { }

我认为它将需要能够创建一个随机生成器类与用户给出的参数。

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

  • inline
  • template
  • static

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