2014-12-03 121 views
0

我有一個包含FieldBase類型的對象的向量。我正在嘗試搜索具有特定名稱的FieldBase元素並將其返回。返回一個向量元素

,我發現了錯誤:

error C2664: 'FieldBase::FieldBase(const FieldBase &)' : cannot convert parameter 1 from 'FieldBase *' to 'const FieldBase &' 1>
Reason: cannot convert from 'FieldBase *' to 'const FieldBase' 1>
No constructor could take the source type, or constructor overload resolution was ambiguous

這裏是我FieldBase

class FieldBase { 
    public: 
     FieldBase(); 

     CString name; 
     bool state; 
     int size; 

     CString getName(); 
     void setName(CString name); 
     bool getState(); 
     void setState(bool state); 
     int getSize(); 
     void setSize(int size); 
}; 

這是試圖返回對象的方法:

FieldBase GetField(CString name) { 
    vector<FieldBase*>::iterator it; 
    for (it = m_Message.begin(); it != m_Message.end(); ++it) { 
     if (name.Compare((*it)->getName()) == 0) { 
      break; 
     } 
    } 
    return *it; 
} 

也許另一個值得問的問題是(*it)->getName()怎麼沒有編譯錯誤或者返回*it呢?

+0

因爲'* it'是一個指針,而不是一個值。 – quantdev 2014-12-03 01:07:15

+0

也許是因爲'它'在堆棧上,並且不能作爲結果傳遞給調用函數。 – 2014-12-03 01:14:29

回答

0

你的向量包含指針,你正在返回*它是一個指針,但是你的簽名返回一個對象。

用途:

return **it; 

除非沒有匹配!

不如歸去迭代

vector<FieldBase*>::iterator GetField(.... 

... 

return it; 
} 

從長遠來看,你最好學會如何使用std :: find()方法

+0

'返回**它'工作,做了我想要的。使用'return it'給出以下錯誤intead:'錯誤C2664:'FieldBase :: FieldBase(const FieldBase&)':無法將參數1從'std :: _ Vector_iterator <_Ty,_Alloc>'轉換爲'const FieldBase&' – 2014-12-03 20:47:51

+0

正如我所示在我的回答中,如果你想返回迭代器(哪個更好),那麼你必須改變方法簽名。請注意,如果正在搜索的字符串不存在於矢量中,則返回該對象將導致可怕的崩潰。 – ravenspoint 2014-12-03 20:55:49