簡體   English   中英

對C ++嵌套依賴類型名稱感到困惑

[英]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內部, BSTBST<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM