使用vs2010编译时模板重新定义错误
Template re-definition error when compiled with VS 2010
我遇到了某种模板重新定义错误。这不是一个解决方案破坏错误(我已经找到了变通方法),但我仍然想了解为什么代码是错误的。
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
在所有其他情况下,将定义仅放在一个编译单元中,并在头文件中使用前向声明(原型)使其对其他编译单元可见。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件