无法从'std :: _ Vector_iterator< _Myvec>'转换参数1到'std :: _ Vector_iterator< _Myvec>'

时间:2015-06-11 06:42:25

标签: c++ vector

我有一个问题,它有点难以描述,所以请对我这么容易。

我有两个类,A和B,A类有一个私有成员 - 矢量:

class A
{
private:
    struct complex
    {
       int x;
       vector< int > y;
    };

    vector< complex > m_resultVector; // <---- the private member

public:
    void getPointerToVector( vector< complex >::iterator it )
    {
        it = m_resultVector.begin();
    }
};

我需要从B类访问(仅读取)m_resultVector;,我可以编写get函数,但m_resultVector是非常长的向量,我不想要要将整个矢量复制到一个新矢量,我想发送它的指针。也是重要的部分 - 我需要B类不能改变m_resultVector

的内容
class B
{
    struct complex
    {
        int x;
        vector< int > y;
    };

    void functionOf_B()
    {
        A class_A;
        vector< complex >::iterator p_resultVector;

        class_A.getPointerToVector(p_resultVector); // <------ compilation error here

        // some reading from the content of p_resultVector
    }
};

当我尝试编译它时,我收到错误:

  

无法从'std :: _ Vector_iterator&lt; _Myvec&gt;'转换参数1至   '的std :: _ Vector_iterator&LT; _Myvec&GT;'

基本上,我不得不提问 -

  1. 为什么我会收到此错误? complex结构在两个类中定义。
  2. 我在哪里以及如何在B类const iterator上声明,因此它是只读的?我不确定......

2 个答案:

答案 0 :(得分:5)

这是因为A::complexB::complex是不同的类型(内容相同,但无关紧要)。因此vector<A::complex>vector<B::complex>不同。将struct complex的定义移至AB之外。

您的代码中还存在更多问题。 A::getPointerToVector什么都不做,因为它将输入向量迭代器复制到临时迭代器,为它赋值,在从该函数返回后,一切都会丢失。使用此方法,您必须传递vector<complex>::iterator作为参考(因此vector<complex>::iterator&)。

我宁愿在A中像这样写一个方法

const vector<complex>& get_vector() const
{
    return m_resultVector;
}

我就是这样,你可以做到这一点。

void foo()
{
    A class_A;
    // do something with A
    const vector<complex>& p_result = class_A.get_vector();

    // now you are holding whole vector and you can call methods
    // defined as const (which does not modify that vector)
    p_result.begin();
    p_result.at(0);
    p_result.end();
}

答案 1 :(得分:0)

Zereges解决方案似乎很好。但我明白你不想回归矢量。我无法提出除下面以外的任何解决方案。

在A组:

void getPointerToVector(int position, int &var,vector<int>& o_Vec)
{

    vector<complex>::iterator itr;
    complex c;
    c = m_resultVector.at(position);
    var = c.x;
    o_Vec = c.y;

}

在B班:

 void functionOf_B()
{

    A class_A;
    int aVar;
    std::vector<int> vec;
    class_A.getPointerToVector(2, aVar, vec);


        // some reading from the content of p_resultVector

}

我不确定这是多么有效和复杂。我建议更好地使用Zereges解决方案