2016-04-24 9 views
0

asdfという名前のstd::setの配列にアクセスすると、このコードがコンパイルされない理由を理解しようとしています。ただし、関数getItemがなければ、この例ではインデックス0などのasdfの要素にアクセスしようとするとコードがコンパイルされます。コンパイラはこのエラーをスローします。コードが正常に動作し、比較器なしstd :: setとcomparatorの配列

#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; 
} 

:ここ

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 

は一例です。

答えて

0

std::set<test*, test::compare>std::set<test*>は異なるネットタイプであり、暗黙的に1つから別のものに変換することができませんでした。そのため、コンパイラは不平を言います。

std::setのでstd::set<test*, test::compare>

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

std::set<test*>になり、2つのデフォルトテンプレート引数を持ってい

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

あなたが問題を解決するためにconst std::set<test*, test::compare>&getItem()の戻り値の型を変更する場合がありますされます。

+1

拡張する必要があるかもしれません。これらのタイプのいずれかから他のタイプへの暗黙的な変換はないため、コンパイルエラーです。 – Peter

+0

うわー、私はどのようにミスマッチタイプがあるのを見逃しましたか?私は、わかりやすいコンパイラエラーが何であるかを調べようともっと集中していたと思います。 –

+0

@BrandanTylerLasleyエラーメッセージにはまだヒントがあります。特に、変換に失敗した2つのタイプが示されています。 – songyuanyao

関連する問題