我遇到了某种模板重新定义错误。这不是一个破坏解决方案的错误(我找到了解决方法),但我仍然想了解为什么代码是错误的。
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::function 的结构,这样我就可以一遍又一遍地调用它来获得一个随机整数。
该函数看起来像这样:
template <typename Container, typename RandomGenerator>
void scramble(Container c, RandomGenerator rand) { }
我认为需要能够使用用户给出的参数动态创建一个随机生成器类。