2012-11-15 37 views
0

我想要在C++中使用自定義標量對象來獲取STL地圖,以便我可以在OpenCV的地圖中使用標量類。我收到以下錯誤:在地圖拋出錯誤的C++自定義對象

error: ‘template class std::map’ used without template parameters

,這是使用模板IM:

template<typename _Tp> class MyScalar_ : public Scalar_<_Tp>{ 
public: 
    MyScalar_(); 
    MyScalar_(Scalar_<_Tp>& s){ 
     _s = s; 
    }; 
    _Tp& operator[](const int idx){ 
     return _s[idx]; 
    } 
    //std::less<_Tp>::operator()(const _Tp&, const _Tp&) const 
    //this wont work if scalars are using doubles 
    bool operator < (const MyScalar_<_Tp>& obj) const { 
     double lhs,rhs; 
     lhs = _s[0] + _s[1] + _s[2] + _s[3]; 
     rhs = _s[0] + _s[1] + _s[2] + _s[3]; 
     return lhs > rhs; 
    } 
    bool operator == (const MyScalar_<_Tp>& obj) const{ 
     bool valid = true; 
     for(int i = 0;i<_s.size();i++){ 
      if(_s[i] != obj[i]) 
       return false; 
     } 
     return valid; 
    } 
    private: 
     Scalar_<_Tp> _s; 
}; 

我有std::map< MyScalar,Point > edgeColorMap;在我的頭文件以及

上述狀態的錯誤該行:

auto tempit = edgeColorMap.find(s); 
    if(tempit != std::map::end){//found a color that this pixel relates to 

失敗在我f聲明,我無法弄清楚爲什麼?

+0

你爲什麼認爲'std :: map :: end'可以工作?另外,請閱讀[有關在C++標識符中使用下劃線的規則?](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in- AC-標識符)。 –

+0

這很有趣,你說下劃線的東西,我只是跟着OpenCV中的C++ api做什麼! – L7ColWinters

+1

那麼,唯一可以返回的東西是使用'()'的函數,因爲'end()'是一個非靜態成員函數,所以你需要在實例上調用它。另外請注意,並非所有的下劃線都是禁止的,在你的情況下'_Tp','MyScalar_'和'Scalar_'是禁止的。 –

回答

1

您需要使用一個迭代器從實際map實例:

if(tempit != edgeColorMap.end()) { 

std::map::end()僅僅是一個正常的功能,它返回容器的最後一個元素之後的迭代器或常量性的元素。

相關問題