在类中声明自定义比较器时类型/值不匹配
Posted
技术标签:
【中文标题】在类中声明自定义比较器时类型/值不匹配【英文标题】:type/value mismatch while declaring custom comparator in a class 【发布时间】:2017-06-06 18:08:14 【问题描述】:我对以下课程有疑问。我收到错误“Tree.cpp:12:56: error: type/value mismatch at argument 2 in the template class std::multiset' // Tree.cpp:12:56: note: expected a type,得到'(Tree::compare
#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 );
【问题讨论】:
multiset 的比较器应该采用两个 const 引用;您的代码需要两个引用。参数中的const
固定到指针,而不是引用。 IE。你的参数是对const Tree *
对象的非常量引用。那是错误的。它应该是至少 Tree * const&
@WhozCraig 编译器仍然抱怨“‘class Tree您可能希望将此行更改为
typedef
typename std::multiset<Tree*, typename Tree::compare >
NodeSet;
注意compare
是dependent name,所以你需要使用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
似乎没有在您的代码中的任何地方定义。
【讨论】:
@Surferonthefall 我也没有编译它,但错误会转移到另一行。另请注意,您的示例不完整(您省略了#include
s),因此无法完全解决您的错误。
你应该可以只写Tree
,因为它是一个 injected-class-name 或其他 - 但有些场合不适合某些原因
@BoundaryImposition 感谢您的评论。我会仔细阅读的。
更新了代码.. 在我看来问题仍然在 multiset 行!
“Tree.cpp:9:65: 错误:‘class Tree以上是关于在类中声明自定义比较器时类型/值不匹配的主要内容,如果未能解决你的问题,请参考以下文章
C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]
WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResultvoidHttpResponseMessage自定义类型