【发布时间】:2013-05-11 01:56:25
【问题描述】:
例如,考虑以下情况,其中存在名称冲突 nest1:
template <typename U> class nest1 {};
class cls {
public:
template <typename V> class nest1 {};
template <typename W> class nest2 {
public:
void bar(nest1<W> x);
};
};
template <typename W>
void cls::nest2<W>::bar(nest1<W> x) {} // how does compiler know which nest<1>?
- 如果我们不以
cls::为前缀(例如bar(cls::nest1<W> x)),编译器如何知道bar是采用nest1<W>还是cls::nest1<W>? - 无论如何,明确地为
cls::加前缀是一种好习惯吗?
注意:编译器实际上选择隐式声明 bar(cls::nest1<W> x):
- 致电
cls::nest1<W> x; bar(x);工作:http://ideone.com/3ZuH2Z - 传递
nest1<W> x; bar(x);失败:http://ideone.com/6HmA3f
【问题讨论】:
-
同名的全局变量和静态数据成员相同。
-
所以它只是剥离层并在最近的父/祖先类中找到所需的声明?
-
哦,我以为它会选择全局的。您可能应该在问题中指定这一点。
标签: c++ class templates nested