c ++:无法实例化std :: set模板类

时间:2012-11-28 20:36:18

标签: c++ templates std

给出以下课程

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)));

这产生了一个巨大的错误

2 个答案:

答案 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)

setmultisetmapmultimap)需要比较函数或运算符。如果未指定set,则multisetmapmultimap会使用std::less功能对象来设置集合中的元素。 所以你必须写这样的东西

template <typename T>
class Plane {
public:
    friend bool operator < (const Plane<T>& p1, const Plane<T>& p2)
    {
         return ???
    }
};

正如你所看到的那样,集合中的平面不是一个很好的类,可能更好unordered_set或仅仅std::vector