例如,考虑以下存在 name 冲突的情况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>?
- 编译器如何知道是否
bar
需要nest1<W>
或cls::nest1<W>
我们是否不使用cls::
(例如bar(cls::nest1<W> x)
)作为前缀? 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