当我访问名为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;
}
没有比较器,代码工作正常。
答案 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>&
以解决问题。