在类中声明自定义比较器时类型/值不匹配

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&amp; @WhozCraig 编译器仍然抱怨“‘class Tree’中没有名为‘compare’的类型” Move the comparator above the typedef. @WhozCraig yessss.... 非常感谢! 【参考方案1】:

您可能希望将此行更改为

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 我也没有编译它,但错误会转移到另一行。另请注意,您的示例不完整(您省略了#includes),因此无法完全解决您的错误。 你应该可以只写Tree,因为它是一个 injected-class-name 或其他 - 但有些场合不适合某些原因 @BoundaryImposition 感谢您的评论。我会仔细阅读的。 更新了代码.. 在我看来问题仍然在 multiset 行! “Tree.cpp:9:65: 错误:‘class Tree’中没有名为‘compare’的类型”!

以上是关于在类中声明自定义比较器时类型/值不匹配的主要内容,如果未能解决你的问题,请参考以下文章

C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]

C++之类之类的其它特性

在类中使用自定义排序时出现编译错误 [重复]

使用变量在类中存储自定义函数

WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResultvoidHttpResponseMessage自定义类型

在类中声明装饰器