对于我的高级数据结构类,我试图找出typename如何工作
/** Return an iterator pointing past the last item in the BST.
*/
iterator end() const {
return typename BST<Data>::iterator(nullptr);
}
答案 0 :(得分:0)
我不确定你理解了多少但是,对于为什么在该return语句中使用typename的一个非常粗略的概括如下:在限定的依赖类型之前,必须使用typename。 C ++有一个解析规则,声明限定的依赖名称将被解析为非类型,即使它导致语法错误。因此,如果在作用域中存在一个名为nc的变量,则该示例在不使用typename的情况下是合法的,但是,它将被解释为乘法。这最终会导致错误,因为您无法通过类型乘以某些东西(不考虑运算符重载会引入更多复杂性)。通过使用typename,您告诉/强制编译器将后面的名称视为类型。 尝试使用此代码并删除typename,您应该收到编译器错误
class Foo {
public:
class NestedType {
public:
};
};
template <typename T>
struct MyStruct {
typename T::NestedType * nt; // Declare a pointer to T's NestedType
};
int main(int argc, char *argv[]) {
struct MyStruct<Foo> myStruct;
return 0;
}