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。如果要将其保留在标题中,可以将其声明为内联
(或静态
)。