[英]Confused about C++ nested dependent type name
有效的C ++告訴我,當遇到嵌套的依賴類型名稱時,我最好使用typename
。
以下示例代碼很容易理解:
template <typename ElementType>
class BST {
private:
class LinkNode {
public:
ElementType data;
LinkNode *left, *right;
explicit LinkNode() {}
};
public:
void some_func();
}
template <typename ElementType>
void BST<ElementType>::some_func() {
// or `using NodePtr = typename BST<ElementType>::LinkNode *;`
typedef typename BST<ElementType>::LinkNode * NodePtr;
...
}
但是,在我在模板類BST中添加別名后,似乎不再需要關鍵字typename
。
在這里你可以看到:
template <typename ElementType>
class BST {
private:
class LinkNode {
public:
ElementType data;
LinkNode *left, *right;
explicit LinkNode() {}
};
using NodePtr = LinkNode *; // the only difference between these two code blocks
public:
void some_func();
}
template <typename ElementType>
void BST<ElementType>::some_func() {
// typename is not neccessary here!
BST<ElementType>::NodePtr ptr;
...
}
有人能搞清楚嗎?
該效果並未通過using
直接與類型別名相關聯,它是當前實例化成員的名稱查找結果。
在BST
內部, BST
和BST<ElementType>
表達式引用當前實例化,並且可以在不需要您可以執行的前綴typename
情況下找到它的成員:
template <typename ElementType>
void BST<ElementType>::some_func() {
BST::NodePtr ptr; // or
BST<ElementType>::LinkNode * ptr2;
}
導致同樣的事情。 但現在讓我們假設some_func
也是一個模板成員函數,定義如下:
template <typename ElementType>
struct BST {
class LinkNode { /*...*/ };
using NodePtr = LinkNode *;
template <typename T>
void some_func();
};
template <typename ElementType>
template <typename T>
void BST<ElementType>::some_func() {
BST<T>::NodePtr ptr; // (1)
BST<T>::LinkNode * ptr2 // (2)
}
現在,(1)和(2)都不會編譯,因為B<T>
不再是當前的實例化,因此在這些情況下你需要typename
。
標准[temp.res]/7
的相關部分:
在類模板的定義內或在declarator-id之后的類模板成員的定義內,當引用聲明類型或類的模板的先前聲明的成員的名稱時,不需要關鍵字typename。類模板。 [...]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.