несоответствие типа/значения при объявлении пользовательского компаратора в классе

64
9

У меня проблема со следующим классом. Я получаю сообщение об ошибке "Tree.cpp: 12: 56: ошибка: несоответствие типа/значения в аргументе 2 в списке параметров шаблона для 'template class std :: multiset//Tree.cpp: 12: 56: note: ожидается тип, полученный '(Дерево :: сравнение <) ". Я не понимаю, как передать тип компаратора в объявлении мультимножества. Не могли бы вы помочь мне?

#include <set>
#include <deque>
#include <iostream>
using namespace std;

template <typename T>
class Tree
{
typedef typename std::multiset<Tree<T>*, typename Tree<T>::compare > NodeSet;

private:
NodeSet children;
T content;

public:
struct compare
{
bool operator()( const Tree*& t1, const Tree*& t2 ) const
{
cout << "Comparing " << t1->GetContent() << " vs " << t2->GetContent() << endl;
return t1->GetContent() < t2->GetContent();
}
};
Tree& AppendNode( const T& node )
{
Tree* t = new Tree( node );
AttachTree( t );
return *t;
}
void Clear()
{
typename NodeSet::iterator it = children.begin();
while( children.size() != 0 && children.end() != it )
{

children.erase( *it );
delete *it;
it++;
}
}
Tree( const T& root )
{
content = root;
}
void AttachTree( Tree* t )
{
children.insert( t );
}
void Visit( std::deque<T>& exp ) const
{
exp.push_back( content );
typename NodeSet::iterator it = children.begin();
while( it != children.end() )
{
( *it )->Visit( exp ); it++;
}
}
Tree()
{}
Tree( Tree& c )
{
c.DeepCopyTo( this );
}
T& operator =( const Tree& b )
{
b.DeepCopyTo( this );
}
~Tree()
{
cout << "in destructor for" << this << endl;
Clear();
}
void DeepCopyTo( Tree* dest ) const
{
dest->content = content;
typename NodeSet::iterator it = children.begin();
while( it != children.end() )
{
Tree* t = new Tree();
( *it )->DeepCopyTo( t );
dest->AttachTree( t );
it++;
}
}
void Print()
{
typename NodeSet::iterator it = children.begin();
while( it != children.end() )
{
cout << *it << ",";
it++;
}
}
};

int main()
{
Tree<int> tree( 8 );
tree.AppendNode( 5 );
}

спросил(а) 2021-01-19T21:45:56+03:00 6 месяцев, 1 неделя назад
1
Решение
63

Вы можете изменить эту строку на

typedef 
typename std::multiset<Tree*, typename Tree::compare >
NodeSet;

Обратите внимание, что compare является зависимым именем, поэтому вам нужно использовать typename.

Кроме того, вам следует рассмотреть возможность перемещения структуры по compare этой строкой, так как эта строка ссылается на нее.

Еще две вещи, чтобы заметить.

Вы можете изменить compare с

struct compare {
bool operator()(const Tree* t1, const Tree* t2) const {
cout << "Comparing " <<t1->GetContent() <<" vs "<<t2->GetContent()<<endl;
return t1->GetContent() < t2->GetContent();
}
};

К сожалению, GetContent не GetContent нигде в вашем коде.

ответил(а) 2021-01-19T21:45:56+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема