0

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

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

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

4

1 回答 1

1

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

  • inline
  • template
  • static

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

于 2013-04-06T04:42:21.690 回答