Abdelrahman Wahdan Abdelrahman Wahdan -4 years ago 145
C++ Question

Accessing a variable of passed by reference object in passed by reference object

It took me a while to think how to ask this question. The code is too big, so I will try to take only the important parts.

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


Output of:

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)


Your help is appreciated!

Answer Source

Looking at this compiler error more generally, it seems that point::x() is actually a member function, not a variable. So you should be using

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

Why is the error so cryptic? obj.func could be seen as an attempt to use a function as a function-pointer variable (e.g. &T::func). Therefore you see compiler errors about:

  1. Not knowing how to print (using operator<<) a method. Worse, a method with overrides, so its name is ambiguous.
  2. Using object.MethodName is non-standard.
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download