给出以下课程
template <typename T>
class Plane
{
public:
Plane<T>(T A, T B, T C, const Vector3<T>& vec):
A(A),
B(B),
C(C),
D(-1*A*vec.x-B*vec.y-C*vec.z)
{
}
Plane<T>():
A(0),
B(0),
C(0),
D(0)
{
}
bool CalculateTime(const Vector3<T>& r0, const Vector3<T>& rd, T& result )
{
Vector3<T> vec(A,B,C);
if ( vec.dot(rd))
{
result = -1;
return false;
}
else
{
result = (vec.dot(r0) + D)/vec.dot(rd);
return true;
}
}
T A;
T B;
T C;
T D;
};
出于以下某些奇怪的原因
std::set<Plane<float> > s;
s.insert(Plane<float>(10,20,30,Vector3f(10,30,40)));
std::set<Plane<float> > s;
s.insert(Plane<float>(10,20,30,Vector3f(10,30,40)));
这产生了一个巨大的错误
答案 0 :(得分:4)
重要的部分是在您的错误消息的末尾:
...
error C2676: binary '<' : 'const Plane<T>' does not define this operator
or a conversion to a type acceptable to the predefined operator
std::set
的元素需要可订购,即。它需要能够说一个对象小于另一个。
最直接的方法是为您的班级实施operator <
方法。不幸的是,不直截了当地定义了“小于”对于三维平面的意义!
使用std::unordered_set
进行调查可能值得考虑,{{1}}只要求元素具有可比性。
答案 1 :(得分:2)
set
(multiset
,map
和multimap
)需要比较函数或运算符。如果未指定set
,则multiset
,map
和multimap
会使用std::less
功能对象来设置集合中的元素。
所以你必须写这样的东西
template <typename T>
class Plane {
public:
friend bool operator < (const Plane<T>& p1, const Plane<T>& p2)
{
return ???
}
};
正如你所看到的那样,集合中的平面不是一个很好的类,可能更好unordered_set
或仅仅std::vector