OpenCV, C++: вставка в набор

Я разрабатываю приложение C++ с использованием NetBeans 6.9 в Ubuntu 11.04. Я использую OpenCV 2.3.1. Мне было интересно, может ли кто-нибудь сказать мне, что не так с этим кодом.

void AddTriangle(CvPoint buf[3], set< Triangle > &V)
{
Triangle triangle;
int inc;

for (inc=0; inc<3; ++inc)
{
    triangle.v[inc].x=buf[inc].x;
    triangle.v[inc].y=buf[inc].y;
}
V.insert((const Triangle) triangle);

}

Я получаю следующее сообщение об ошибке, когда пытаюсь скомпилировать.

from /usr/include/c++/4.5/bits/locale_classes.h:42,
from /usr/include/c++/4.5/bits/ios_base.h:43,
from /usr/include/c++/4.5/ios:43,
from /usr/include/c++/4.5/istream:40,
from /usr/include/c++/4.5/sstream:39,
from /usr/include/c++/4.5/complex:47,
from /usr/local/include/opencv2/core/core.hpp:59,
from ../../OpenCV-2.3.1/include/opencv/cv.h:64,
from ../../OpenCV-2.3.1/include/opencv/cv.hpp:50,
from ../../DraculaFiles/TwoDTriangulation.cpp:12:
/usr/include/c++/4.5/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = sTriangle]’:
In file included from /usr/include/c++/4.5/string:50:0, /usr/include/c++/4.5/bits/stl_tree.h:1184:4: instantiated from ‘std::pair, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = sTriangle, _Val = sTriangle, _KeyOfValue = std::_Identity, _Compare = std::less, _Alloc = std::allocator]’
/usr/include/c++/4.5/bits/stl_set.h:408:29: instantiated from ‘std::pair, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const value_type&) [with _Key = sTriangle, _Compare = std::less, _Alloc = std::allocator, typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator = std::_Rb_tree_const_iterator, value_type = sTriangle]’

Треугольник определяется следующим образом.

typedef struct sTriangle
{
CvPoint v[3];
} Triangle;

Любая помощь будет принята с благодарностью,
Питер.


person OtagoHarbour    schedule 17.03.2012    source источник
comment
У меня такое ощущение, что это не полный вывод ошибок. Должна быть строка, в которой есть слово error.   -  person Irfy    schedule 17.03.2012
comment
Пока вы извлекаете остальную часть вывода ошибок, есть ли причина не ограничивать счетчик циклов локально for(int inc = 0; ...)?   -  person thb    schedule 17.03.2012
comment
Остальная часть сообщения об ошибке   -  person OtagoHarbour    schedule 18.03.2012
comment
Остальная часть сообщения об ошибке: /usr/include/c++/4.5/bits/stl_function.h:230:22: ошибка: нет соответствия для «оператора‹» в «__x ‹ __y» ../../DraculaFiles/ TwoDTriangulation.cpp:3838:6: примечание: кандидат: логический оператор‹(const TriangleInID&, const TriangleInID&)   -  person OtagoHarbour    schedule 18.03.2012


Ответы (2)


Чтобы поместить Triangle в набор, вы должны реализовать оператор сравнения. В противном случае набор не может сказать, какие значения равны, а какие различны.

typedef struct sTriangle
{
CvPoint v[3];
bool operator<(const sTriangle& other) const;
} Triangle;

bool sTriangle::operator<(const sTriangle& other) const
{
   // compare 'this' with 'other'
}

Для реализации оператора less вы можете вдохновиться здесь.

Изменить: вы можете реализовать оператор less даже без изменения структуры sTriangle:

typedef struct sCvPoint {
int x;
int y;
} CvPoint;

typedef struct sTriangle
{
CvPoint v[3];
} Triangle;

bool operator==(CvPoint const& left, CvPoint const& right)
{
    return left.x == right.x && left.y == right.y;
}

bool operator<(CvPoint const& left, CvPoint const& right)
{
    return left.x == right.x
        ? left.y < right.y
        : left.x < right.x;
}

bool operator<(Triangle const& left, Triangle const& right)
{
    return left.v[0] == right.v[0]
        ? left.v[1] == right.v[1]
            ? left.v[2] < right.v[2]
            : left.v[1] < right.v[1]
        : left.v[0] < right.v[0];
}
person Miroslav Bajtoš    schedule 17.03.2012

STL не различает экземпляры треугольников в наборе и ищет перегруженный оператор "‹".

person alexm    schedule 17.03.2012