std :: set和比较器

时间:2016-04-24 05:28:19

标签: c++ c++11

当我访问名为asdf的std::set数组时,我试图弄清楚为什么这段代码无法编译。但是,如果在此示例中尝试访问asdf的元素(如索引0),则在没有函数getItem的情况下编译代码。编译器将抛出此错误。

main.cpp(21): error C2440: 'return': cannot convert from 'const std::set<test *,test::compare,std::allocator<_Kty>>' to 'const std::set<test *,std::less<_Kty>,std::allocator<_Kty>> &'
      with
      [
          _Kty=test *
      ]
main.cpp(21): note: Reason: cannot convert from 'const std::set<test *,test::compare,std::allocator<_Kty>>' to 'const std::set<test *,std::less<_Kty>,std::allocator<_Kty>>'
      with
      [
          _Kty=test *
      ]
main.cpp(21): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

以下是示例:

#include <set>

struct test {
    int idx;
    struct compare {
        bool operator()(const test* a, const test* b) {
            return a->idx < b->idx;
        }
    };
};


class asdf123 {
public:
    asdf123() {

    }

    const std::set<test*>& getItem() const
    {
        return asdf[0];
    }

private:
    typedef std::set<test*, test::compare> stuffType[100];
    stuffType asdf;
};

int main() {
    asdf123 a;
    return 0;
}

没有比较器,代码工作正常。

1 个答案:

答案 0 :(得分:0)

std::set<test*, test::compare>std::set<test*>是不同的类型,无法从一个隐式转换为另一个,这就是编译器抱怨的原因。

std::set有两个默认模板参数,因此std::set<test*, test::compare>将是

std::set<test*, test::compare, std::allocator<test*>> 

std::set<test*>将是

std::set<test*, std::less<test*>, std::allocator<test*>>

您可以将getItem()的返回类型更改为const std::set<test*, test::compare>&以解决问题。