我试图修复返回空向量的函数。我做了一些谷歌搜索,它显示我需要一个类Point
的复制构造函数,我一直收到这个错误:
Undefined symbols for architecture x86_64: "Point::Point(Point const&)", referenced from:
Core::render() in Week3_T.o
Core::sortTriVertices(Point&, Point&, Point&) in Week3_T.o
Core::decompose(std::__1::vector<Point, std::__1::allocator<Point> >) in Week3_T.o
Core::drawTriangle(Point, Point, Point) in Week3_T.o
Core::clipedge(std::__1::vector<Point, std::__1::allocator<Point> >, int, int, int, int) in Week3_T.o
std::__1::enable_if<__is_forward_iterator<Point*>::value, void>::type std::__1::vector<Point, std::__1::allocator<Point>
>::__construct_at_end<Point*>(Point*, Point*) in Week3_T.o
void std::__1::vector<Point, std::__1::allocator<Point> >::__push_back_slow_path<Point const>(Point const&) in Week3_T.o
... ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
和我的班级:
class Point
{
public:
int x;
int y;
Uint8 r;
Uint8 g;
Uint8 b;
Point(int x, int y, Uint8 r, Uint8 g, Uint8 b) : x(x), y(y), r(r), g(g), b(b) {}
Point& operator=(Point const &np){
x=np.x;
y=np.y;
r=np.r;
g=np.g;
b=np.b;
return *this;
}
Point(const Point& );
Point(){}
};
和代码片段:
std::vector<Point> Core::clipedge(vector<Point> polygon, int x0, int y0, int x1, int y1)
{
int r=rand()%255;
int g=rand()%255;
int b=rand()%255;
// For each side of the polygon, check the 4 cases of sutherland-hodgman.
// Creating a temporary buffer to hold your new set of vertices for the clipped polygon.
std::vector<Point> temp;
temp.push_back(Point(1,2,255,255,255));
int size = (int)polygon.size();
for (int i = 0; i < size; ++i) {
{....}
//push_back clipped point
temp.push_back(p1);
{....}
}
return temp;
系统是OSX10.9.2,ide是xcode5.1.1编译器是apple llvm5.1
我需要做些什么来解决这个问题?谢谢你的帮助。
答案 0 :(得分:2)
正如在其他答案中指出的那样,您没有提供Point::Point(const Point&)
的定义,但您已在Point
类定义中声明了它。但是你的类不需要特殊的复制和赋值处理,所以你的问题的解决方案是不来提供缺少的定义,但要删除复制构造函数的声明。也删除赋值运算符:
class Point
{
public:
int x;
int y;
Uint8 r;
Uint8 g;
Uint8 b;
Point(int x, int y, Uint8 r, Uint8 g, Uint8 b)
: x(x), y(y), r(r), g(g), b(b) {}
};
编译器合成的版本将做正确的事情。
答案 1 :(得分:0)
您可能没有在* .C文件中定义Point(const Point& );
....
它编译,因为你已在* .h文件中声明,但在尝试链接时失败,因为代码的其他部分引用的符号在目标文件或库中找不到。