![](/img/trans.png)
[英]C++ template class static const variable member as map key gives undefined reference
[英]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.