1

頭を包み込むことができないような行動をとった。次のように定義されたクラスがあるとします(説明のための簡単な例):

class some_class
{
   public:
        some_class()
        {
            x_["0"] = "0";
            x_["1"] = "1";

            y_[0] = x_.find("0");
            y_[1] = x_.find("1");
        }

        int some_function(int i)
        {
            if(std::find(y_.begin(), y_.end(), x_.find("1")) != y_.end())
            {
                std::cout << "Found!" << std::endl;

                return 1001;
            }

            return -1001;
        }

   private:
       std::unordered_map<string, string> x_;
       std::array<unordered_map<string, string>::iterator, 2> y_;
};

コードはデバッグモードのVisualStudio2012 RCでコンパイルされます(他のモードはテストされていません)が、some_functionの呼び出し中に、プログラムは次のアサーションメッセージで失敗します

... microsoft visual studio 11.0 \ vc \ include \ list行:289

式:互換性のないイテレータを一覧表示します。

呼び出し元のコードは次のようになります

auto vector<int> as;
as.push_back(1);   

auto vector<int> bs;   
auto some = some_class();

std::transform(as.begin(), as.end(), std::inserter(bs, bs.begin()), [=](int i) { return  some.some_function(i); });

質問:

この種の取り決めの問題は何でしょうか?メンバー変数としてではなくsome_functionでx_y_を宣言すると、コードが正常に実行されます。クラスは、状況を考慮に入れる必要がある場合、std::transformのように呼び出され/使用されます。

接線はさておき、次の宣言はコンパイラによって拒否されるように見えますが、拒否する必要がありますか?

std::unordered_map<string, string> x_;
std::array<decltype(x_.begin()), 2> y_;

エラーメッセージは

エラーC2228:「。begin」の左側にはclass / struct/unionが必要です

4

1 に答える 1

2

あなたの状況。

#include <unordered_map>
#include <array>
#include <iostream>
#include <string>

class some_class
{
   public:
        some_class()
        {
            x_["0"] = "0";
            x_["1"] = "1";

            y_[0] = x_.find("0");
            y_[1] = x_.find("1");
        }

        int some_function()
        {
            if(std::find(y_.begin(), y_.end(), x_.find("1")) != y_.end())
            {
                std::cout << "Found!" << std::endl;

                return 1001;
            }

            return -1001;
        }

   private:
       std::unordered_map<std::string, std::string> x_;
       std::array<std::unordered_map<std::string, std::string>::iterator, 2> y_;
};

void function(some_class cl)
{
    cl.some_function();
}

int main()
{
    some_class c;
    function(c);
}

の後に保存されているiterators別の要素のあなたのポイント、そしてそこに比較があります。mapthiscopy-ctorfind

    bool operator==(const _Myiter& _Right) const
        {   // test for iterator equality
 #if _ITERATOR_DEBUG_LEVEL == 2
        if (this->_Getcont() == 0
            || this->_Getcont() != _Right._Getcont())
            {   // report error
            _DEBUG_ERROR("list iterators incompatible");
            _SCL_SECURE_INVALID_ARGUMENT;
            }

decltypeの場合-

std::unordered_map<string, string> x_;
std::array<decltype(x_.begin()), 2> y_;

class-blockオブジェクトがないため、で正しくありません。これは、である場合x_に機能しますstatic

于 2012-07-28T22:56:27.060 に答える