【发布时间】:2010-05-28 21:29:28
【问题描述】:
这是一个棘手的情况,我想知道有什么方法可以解决它
namespace {
template <class T>
struct Template { /* ... */ };
}
typedef Template<int> Template;
遗憾的是,Template typedef 会干扰未命名命名空间中的 Template 模板。当您尝试在全局范围内执行 Template<float> 时,编译器会在模板名称和 typedef 名称之间引发歧义错误。
您无法控制模板名称或 typedef 名称。现在我想知道是否有可能:
- 在全局命名空间中创建类型定义类型为
Template(即Template<int>)的对象。 - 在全局命名空间中创建
Template<float>类型的对象。
您不允许向未命名的命名空间添加任何内容。一切都应该在全局命名空间中完成。
这是出于好奇,因为我想知道有什么技巧可以解决这种歧义。这不是我在日常编程中遇到的实际问题。
【问题讨论】:
-
我将其设为社区 wiki,因为它实际上是一个有趣的好奇问题,而不是实际问题。 :)
-
请注意,对于第二个问题,至少有一个解决方案可以在所有 clang/gcc/comeau 上编译,但它更难找到 :)跨度>
-
我没有时间充分考虑这一点,但是分配器不是有一些技巧可以用来更改模板参数吗?你能在这里做类似的事情,并最终得到类似
Rebind< ::Template, float>::type的东西吗?这样,Template将被重命名,例如T在Rebind中,并且没有歧义。 -
该死,我会解决这个问题的……需要我的思考帽,我生锈了。