2013-03-26 114 views
0

我有一组SplinePoints和InterpolatedPoints。他们的联盟必须存储在FinalInterpolatedPoints中。C++中两组结构的联合

这是主要的文件:

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

,其中设置1,设置2和基线分别为类型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)

请帮助困难!

+0

检查此问题http://stackoverflow.com/questions/4331962/and-operator-overloading-problem – 999k 2013-03-26 13:39:42

回答

0

尝试:

FinalInterpolatedPoints operator= (const SplinePoints &A) 

即,类型(SplinePoints)之前移动至const关键字。

0

有些事情与您的代码有些奇怪。降typedef在班前:

/*drop: typedef*/ struct SplinePoints { 

而且,你operator= S的关系返回一个引用,例如,

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

除此之外,你还没有提供编译和完整的例子。如果修复上述问题后仍然有问题,请创建一个并编辑该问题。

+0

这将无法编译。当你不使用typedef时,SpliPoints必须被声明为一个结构体。在函数定义的错误位置有一个const。 – fredrik 2013-03-26 14:11:56

+0

@fredrik:在C中可能会出现这种情况(即使这对我来说看起来很奇怪),但肯定不在C++中。这个问题明确标记为C++。 – 2013-03-26 14:14:29

+0

@DanielFrey我删除了typedef并按照你所说的方式更改了代码,但仍然收到相同的错误。 – 2013-03-26 14:32:36