2017-03-23 58 views
0

我花了一段時間思考如何提出這個問題。代碼太大,所以我會盡量只考慮重要部分。訪問被引用對象傳遞的引用對象傳遞的變量

class full_object_detection 
{ 
public: 
    full_object_detection(
     const rectangle& rect_, 
     const std::vector<point>& parts_ 
    ) : rect(rect_), parts(parts_) {} 

    full_object_detection(){} 

    explicit full_object_detection(
     const rectangle& rect_ 
    ) : rect(rect_) {} 

    const rectangle& get_rect() const { return rect; } 
    rectangle& get_rect() { return rect; } 
    unsigned long num_parts() const { return parts.size(); } 

    const point& part(unsigned long idx) const 
    { 
     // make sure requires clause is not broken 
     DLIB_ASSERT(idx < num_parts(), 
      "\t point full_object_detection::part()" 
      << "\n\t Invalid inputs were given to this function " 
      << "\n\t idx:   " << idx 
      << "\n\t num_parts(): " << num_parts() 
      << "\n\t this:  " << this 
      ); 
     return parts[idx]; 
    } 

    point& part(unsigned long idx) { 
     // make sure requires clause is not broken 
     DLIB_ASSERT(idx < num_parts(), 
      "\t point full_object_detection::part()" 
      << "\n\t Invalid inputs were given to this function " 
      << "\n\t idx:   " << idx 
      << "\n\t num_parts(): " << num_parts() 
      << "\n\t this:  " << this 
      ); 
     return parts[idx]; 
    } 

    friend void serialize (
     const full_object_detection& item, 
     std::ostream& out 
    ) 
    { 
     int version = 1; 
     serialize(version, out); 
     serialize(item.rect, out); 
     serialize(item.parts, out); 
    } 

    friend void deserialize (
     full_object_detection& item, 
     std::istream& in 
    ) 
    { 
     int version = 0; 
     deserialize(version, in); 
     if (version != 1) 
      throw serialization_error("Unexpected version encountered while deserializing dlib::full_object_detection."); 

     deserialize(item.rect, in); 
     deserialize(item.parts, in); 
    } 

    bool operator==(
     const full_object_detection& rhs 
    ) const 
    { 
     if (rect != rhs.rect) 
      return false; 
     if (parts.size() != rhs.parts.size()) 
      return false; 
     for (size_t i = 0; i < parts.size(); ++i) 
     { 
      if (parts[i] != rhs.parts[i]) 
       return false; 
     } 
     return true; 
    } 

private: 
    rectangle rect; 
    std::vector<point> parts; 
}; 

typedef vector<long,2> point; 

const full_object_detection& d = dets[i]; //Passed by reference object 

輸出的:

cout << d.part(41) << endl; // (123,456)

cout << d.part(41).x << endl; // ERROR!

Error C3867 'dlib::vector<long,2>::x': non-standard syntax; use '&' to create a pointer to member 

Error C2679 binary '<<': no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion) 

您的幫助表示感謝!

+0

「part()」的聲明是什麼?什麼是'rect'和'parts'在?什麼是「點」的聲明? – EyasSH

+0

@EyasSH添加完整課程 –

回答

1

Looking at this compiler error more generally,看來point::x()實際上是一個成員函數,而不是一個變量。所以你應該使用

cout << d.part(41).x() << endl; // :) 

爲什麼錯誤如此神祕? obj.func可被視爲嘗試使用函數作爲函數指針變量(例如&T::func)。因此,您會看到有關編譯器的錯誤:

  1. 不知道如何打印(使用operator<<)方法。更糟糕的是,一個覆蓋的方法,所以它的名字是不明確的。
  2. 使用object.MethodName是非標準的。