避免模板类中的重定义错误
Avoid redefinition error in template class
出于IO目的,我需要与各种类型的字符串相关联。为此,我创建了一个模板类names
,它专门用于我需要命名的每个类型。这是头文件:
template<typename T>
class names {};
template<>
class names<Index> {
public:
static const std::string name;
};
template<>
class names<Integer> {
public:
static const std::string name;
};
以及相应的源文件:
const std::string names<Index>::name = "Index";
const std::string names<Integer>::name = "Integer";
Index
和Integer
通过typedef
定义:
typedef std::ptrdiff_t Index;
typedef int Integer;
该代码在我使用的macOS和Ubuntu机器上编译并运行良好。但是,在 Windows 计算机上,std::ptrdiff_t
定义为int
。然后我收到以下错误:
In file included from lib/mixt_MixtComp.h:22:0,
from dummy.cpp:5:
lib/LinAlg/names.h:28:7: error: redefinition of 'class mixt::names<int>'
class names<Integer> {
^
lib/LinAlg/names.h:22:7: error: previous definition of 'class mixt::names<int>'
class names<Index> {
^
有没有办法避免此错误?我可以使用C++11。
您有两个选择:
- 在 Windows 上,只选择一个专业,不要定义另一个。(哎呀(
-
这里真正需要的是一个强大的 typedef,而不仅仅是一个瘦类型别名。您需要
Index
和Integer
实际上是不同的类型,而不仅仅是在两种情况下可能相同的其他名称。如果你不介意在使用这些类型进行算术时有点麻烦,那么作用域枚举可能是合适的:
enum class Index : std::ptrdiff_t {}; enum class Integer : int {};
现在这两种类型是不同的,但"继承"了你想要的,它们不会相互冲突,甚至不会隐式地相互转换。它可以在你的UNIXy平台和Windows盒子上运行。
事实上,如果这些类型不应该在算术中使用,那么作用域枚举的属性实际上是正确的。
一般来说,我倾向于避免typedef
.它有其用于缩短长名称的用途(尽管为了清楚起见,现在更喜欢using X = Y
(,但对于几乎所有其他事情,您都在乞求您在这里发现的那种麻烦。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件