簡體   English   中英

未定義引用與嵌套類模板靜態const成員

[英]Undefined reference vs. nested class template static const member

我有類似的東西,它是由其他3個類(列表,隊列,堆棧...)繼承的:

template <typename generic>
class singlyLinkedList
{
    protected:

    class innerNode
    {
        public:

        innerNode *NextNode;
        generic Value;

        innerNode( generic value, innerNode *next = NULL ) :
            NextNode(next), Value(value) {}
    };

    innerNode *FirstNode;
    innerNode *LastNode;

    size_t CurrentSize;

    public:

    class iterator
    {
        private:

        innerNode *InnerNode;
        const bool IsDeepCopy;

        static const innerNode DefaultNode;

        public:

        iterator( innerNode *node = NULL ) : InnerNode(node), IsDeepCopy(false)
        {
            if (node == NULL) 
                this->InnerNode = (innerNode*)(&(iterator::DefaultNode));
        }

        iterator( innerNode *node, bool deepCopy ) : IsDeepCopy(deepCopy)
        {
            if (deepCopy) this->InnerNode = new innerNode(node->Value, node->NextNode);
            else this->InnerNode = node;
        }

        ~iterator()
        {
            if (this->IsDeepCopy) delete this->InnerNode;
        }

        inline bool isNull() const
        {
            return (this->InnerNode != &(iterator::DefaultNode));
        }

        // ...other iterator members which doesn't use the static member
    };

    // ...other singlyLinkedList members, some returning iterators
};

我曾經有一個單獨的singlyLinkedNode類既可以用作節點又可以用作迭代器,使用友誼可以對列表類進行特殊訪問...然后,我決定將所有內容更改為現在的樣子(如上一節所述) )。

由於iterator嵌套在類模板中,據我所知,可以在標頭中定義類模板的靜態const成員,因此我沒有理由從鏈接器獲取此代碼的未定義引用錯誤。 但是,我得到這個:

/tmp/cc6vtGDj.o: In function `basicSinglyLinkedList<double>::iterator::iterator(basicSinglyLinkedList<double>::innerNode*)':
oo_test.cpp:(.text._ZN21basicSinglyLinkedListIdE8iteratorC2EPNS0_9innerNodeE[_ZN21basicSinglyLinkedListIdE8iteratorC5EPNS0_9innerNodeE]+0x2d): undefined reference to `basicSinglyLinkedList<double>::iterator::DefaultNode'
/tmp/cc6vtGDj.o: In function `basicBinarySearchTree<int>::iterator::iterator(basicBinarySearchTree<int>::innerNode*)':
oo_test.cpp:(.text._ZN21basicBinarySearchTreeIiE8iteratorC2EPNS0_9innerNodeE[_ZN21basicBinarySearchTreeIiE8iteratorC5EPNS0_9innerNodeE]+0x2a): undefined reference to `basicBinarySearchTree<int>::DefaultNode'
collect2: error: ld returned 1 exit status
Compilation failed.

有人可以解釋一下為什么為什么我收到singlyLinkedList<>::iterator::DefaultNode的鏈接器錯誤,或者...我必須設置“默認節點”來控制無效的迭代器以及它們指向何處?

在標頭中定義模板類的靜態const成員非常好。 但是關鍵是您必須定義它-您只在這里聲明了它。

在類定義之外,您應該添加

template <typename T>
singlyLinkedList::innerNode singlyLinkedList::iterator::defaultNode = T();

(或類似方式)初始化存儲,就像在實現文件中使用常規類的靜態成員一樣。 鏈接器將負責將所有模板化的靜態變量合並到最終的可執行文件中,就像模板功能一樣。

編輯:

以上是我的頭等大事:多給了一點想法,定義將需要更像

template <typename T>
const typename singlyLinkedList<T>::innerNode singlyLinkedList<T>::iterator::defaultNode = T{};

但我現在無法嘗試。 但是,編譯器應指導您實際要說的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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