Я шаблонный класс BSTNode,
BSTNode.h
#ifndef _NODE_BST_H_
#define _NODE_BST_H_
template <class K, class T>
struct BSTNode
{
typedef K keyType;
typedef T elementType;
keyType _key;
elementType _element;
BSTNode<keyType,elementType>* _leftChild;
BSTNode<keyType,elementType>* _rightChild;// constructors
BSTNode();
BSTNode<K,T>::BSTNode (keyType, elementType, unsigned int, BSTNode<K,T>*, BSTNode<K,T>*);
/*
some methods
*/
BSTNode<K,T>& operator=(const BSTNode<K,T>& nodoBST2);
};
template <class K, class T>
BSTNode<K,T>::BSTNode ()
{
_leftChild=NULL;
_rightChild=NULL;
}template <class K, class T>
BSTNode<K,T>::BSTNode (keyType chiave, elementType elemento, unsigned int altezza, BSTNode* figlioSinistro=NULL, BSTNode* figlioDestro=NULL)
{
//constuctor code
}template <class K, class T>
BSTNode<K,T>& BSTNode<K,T>::operator=(const BSTNode<K,T>& nodoBST2)
{
//operator= code
return *this;
}
#endif
main.c
#include <cstdlib>
#include <iostream>
#include "BSTnode.h"using namespace std;
int main(int argc, char *argv[])
{
BSTNode<string,string>* node1,node2;
node1=NULL;
node2=node1;
system("PAUSE");
return EXIT_SUCCESS;
}
Я получаю ошибку
no match for 'operator=' in 'node2 = node1'
candidates are: BSTNode<K, T>& BSTNode<K, T>::operator=(const BSTNode<K, T>&) [with K = std::string, T = std::string]
даже если у меня есть оператор = в классе BSTNode, соответствующий требуемой подписи.
Более того, являясь node1, node2 указывает на класс BSTNode, из своего опыта я знаю, что на самом деле мне даже не нужен operator =.
В чем может быть проблема? Может кто-нибудь, пожалуйста, взглянуть и помочь мне?
Спасибо заранее за ваше время.
BSTNode<string,string>* node1,node2;
… анализируется как
BSTNode<string,string>* node1;
BSTNode<string,string> node2;
… поскольку *
привязывается к узлу 1, а не к имени типа.
То, что вы хотели написать, это либо
BSTNode<string,string>* node1, *node2;
или же
BSTNode<string,string>* node1;
BSTNode<string,string>* node2;
Последнее, очевидно, лучше, потому что оно не позволяет вам делать такие ошибки в будущем :).
Указатели не зависят от =
оператор, и вам не нужно определение, если вы не хотите назначать необработанные объекты.
Знаете ли вы, что
BSTNode<string,string>* node1,node2;
эквивалентно
BSTNode<string,string>* node1;
BSTNode<string,string> node2;
?
Если вы знаете, то правильный формат для operator=
должно быть
node2 = *node1; // where node1 != NULL;
// Otherwise it should still compile but it leads to segmentation fault during run-time.
Если вы просто хотите скопировать указатель, все, что вам нужно сделать, это:
BSTNode<string,string>* node1;
BSTNode<string,string>* node2;
node2 = node1;