类成员容器迭代器在成员函数std :: find中不兼容,但为什么不呢?

时间:2012-07-28 22:33:43

标签: c++ visual-c++ c++11 visual-studio-2012

我遇到了一些我似乎无法绕过头脑的行为。假设我有一个如下定义的类(一个简单的例子):

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

代码在调试模式中编译Visual Studio 2012 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   

1 个答案:

答案 0 :(得分: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的{​​{1}}点,mapthis以及copy-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; } 点数。

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

表示decltype -

class-block

x_中不正确,因为没有对象。如果static为{{1}},这将有效。