我花了一段时间思考如何提出这个问题。代码太大了,所以我会尝试只考虑重要的部分。
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 :(得分:1)
Looking at this compiler error more generally,似乎point::x()
实际上是成员函数,而不是变量。所以你应该使用
cout << d.part(41).x() << endl; // :)
为什么这个错误如此神秘? obj.func
可以被视为尝试将函数用作函数指针变量(例如&T::func
)。因此,您会看到编译器错误:
operator<<
)方法。更糟糕的是,这是一种覆盖方法,因此它的名称含糊不清。object.MethodName
是非标准的。