【发布时间】:2012-06-05 12:29:26
【问题描述】:
我想重写一个参数类型相同但逻辑含义不同的函数。我尝试过类似的方法:
class T
{
};
typedef T Age;
typedef T Height;
typedef T Weight;
void foo(Age a){}
void foo(Height a){}
void foo(Weight a){}
但我有构建错误: 错误 C2084:函数 'void foo(Age)' 已经有一个主体
一种解决方案是:
class Age : public T{};
class Height : public T{};
class Weight : public T{};
但我不想仅仅为此目的用新类填充我的命名空间。
如何在不使用派生类的情况下实现这一点?
编辑:我的代码在一个 cpp 文件中,我不使用标题。这只是一个简单的例子。完整的 cpp 内容在这里:
class T
{
};
typedef T Age;
typedef T Height;
typedef T Weight;
void foo(Age a){}
void foo(Height a){}
void foo(Weight a){}
int main()
{
return 0;
}
错误信息: .cpp(10): error C2084: function 'void foo(Age)' already has a body
【问题讨论】:
-
typedef创建 T 的别名。即使这样也填满了命名空间 -
如果你想要新的类型,你只需必须声明新的类型。
typedef只是为同一类型创建一个新的 name。假设T是int- 编译器将如何解析foo(42)? -
@BoPersson 我永远不会使用直接值调用函数。这些函数是序列化类的一部分,我需要以不同的方式进行序列化,具体取决于文件类型、Path 对象
-
@Felics - 没有区别。在这种情况下,
typedef T Age;只是#define Age T的作用域版本。typedef不会创建新类型,因此不能用于重载。
标签: c++