C ++中两组结构的联合

时间:2013-03-26 13:28:40

标签: c++ operator-overloading

我有一组SplinePoints和InterpolatedPoints。他们的联盟必须存储在FinalInterpolatedPoints中。

这是主文件:

#include <iostream>
#include <vector>
#include <conio.h>
#include <cmath>
#include <algorithm>
#include <iterator>
#include <set>

using namespace std;

typedef struct SplinePoints {
int x;
double y;
SplinePoints(int a, double b) : x(a), y(b) {

}
friend bool operator < (SplinePoints const&A, SplinePoints const&B) {
    return A.x < B.x;
}
};

typedef struct InterpolatedPoints {
int x;
double y;
InterpolatedPoints(int a, double b) : x(a), y(b) {

}
friend bool operator < (InterpolatedPoints const&A, 
                InterpolatedPoints const&B) {
    return A.x < B.x;
}
};

typedef struct FinalInterpolatedPoints {
int x;
double y;
FinalInterpolatedPoints(int a, double b) : x(a), y(b) {

}
friend bool operator < (FinalInterpolatedPoints const&A, 
                FinalInterpolatedPoints const&B) {
    return A.x < B.x;
}
FinalInterpolatedPoints operator= (SplinePoints const&A) {
    x = A.x;
    y = A.y;
    return *this;
}
FinalInterpolatedPoints operator= (InterpolatedPoints const&A) {
    x = A.x;
    y = A.y;
    return *this;
}
};

inline bool operator < (InterpolatedPoints const&A, 
                SplinePoints const&B) {
return A.x < B.x;
}

int main (int argc, char** argv) {

set <SplinePoints> set1;
set <InterpolatedPoints> set2;
set <FinalInterpolatedPoints> BaseLine;

set1.insert(SplinePoints(1,2));
set1.insert(SplinePoints(2,5));
set1.insert(SplinePoints(3,8));
set1.insert(SplinePoints(4,1.66));

set2.insert(InterpolatedPoints(5,5.768));
set2.insert(InterpolatedPoints(6,5.560));
set2.insert(InterpolatedPoints(7,5.643));
set2.insert(InterpolatedPoints(8,5.313));

set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), inserter(BaseLine, BaseLine.begin()));

getch();
return 0;
}

我用这个函数来做到这一点:

set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), inserter(BaseLine, BaseLine.begin()));

其中set1,set2和BaseLine分别为SplinePoints,InterpolatedPoints和FinalInterpolatedPoints类型。

当我调试程序时,我得到了<和'='运算符的模板重载错误,这些运算符引用了头文件alogrithm的源文件

template<class _InIt1,
class _InIt2,
class _OutIt> inline
_OutIt _Set_union(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
{   // OR sets [_First1, _Last1) and [_First2, _Last2), using operator<
for (; _First1 != _Last1 && _First2 != _Last2; )
    **if (_DEBUG_LT(*_First1, *_First2))**
        {   // copy first
        ***_Dest++ = *_First1;**
        ++_First1;
        }
    **else if (*_First2 < *_First1)**
        {   // copy second
        ***_Dest++ = *_First2;**
        ++_First2;
        }
    else
        {   // advance both
        ***_Dest++ = *_First1;**
        ++_First1;
        ++_First2;
        }
_Dest = _STD copy(_First1, _Last1, _Dest);
return (_STD copy(_First2, _Last2, _Dest));
}

我在结构定义中包含了运算符重载函数,但我只能删除与<函数相关的错误。 我仍然难以消除与=相关的错误,即:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const SplinePoints' (or there is no acceptable conversion)

请帮忙!

2 个答案:

答案 0 :(得分:0)

尝试:

FinalInterpolatedPoints operator= (const SplinePoints &A)

也就是说,在{(1}})类型之前移动const关键字。

答案 1 :(得分:0)

您的代码有些奇怪。将typedef放在课程前面:

/*drop: typedef*/ struct SplinePoints {

此外,您的operator=应返回引用,例如,

FinalInterpolatedPoints& operator= (SplinePoints const&A) {
//                     ^ add this!
    x = A.x;
    y = A.y;
    return *this;
}

除此之外,您还没有提供可编辑的完整示例。如果在修复上述内容后仍有问题,请创建一个并编辑问题。