链接错误" ld:致命:符号引用错误。"

时间:2014-09-28 14:42:46

标签: c++ c++11 linker-errors

我还在学习c ++并且正在关注我的书中的一个例子。我基本上复制了他们的代码并添加了include和namespace。我做错了什么?

代码:

#include <iostream>
#include <string>
using namespace std;

class Date{
  int y,m,d;
public:
  Date(int y, int m, int d);
  int month(){return m;}
  int day(){return d;}
  int year(){return y;}
};

int main(){
  Date b{1970,12,30};
cout<< b.month()<< '\n';
}

尝试使用g ++ -std = c ++ 11 -o test2 test2.cc

进行编译

错误:

Date::Date(int, int, int)           /var/tmp//ccGuivAs.o
ld: fatal: Symbol referencing errors. No output written to main    
collect2: ld returned 1 exit status

4 个答案:

答案 0 :(得分:0)

声明了 Date::Date构造函数,但从未定义它。

您的声明是对编译器的承诺,即构造函数Date::Date将在某处定义。但你从未真正提供过定义。这就是造成错误的原因。

您可以在类定义中提供定义,就像您使用其他成员函数一样。或者您可以在课堂外提供定义。它是由你决定。但必须在某处提供定义。

答案 1 :(得分:0)

Date(int y, int m, int d);

错误消息表明Date没有定义(以一种公认的不明确的方式)。它已声明,但未定义。您没有指定构造函数执行的操作

Date(int y, int m, int d) {
    this->y = y;
    this->m = m;
    this->d = d;
}

或者,更好的是,使用initializer list语法:

Date(int y, int m, int d): y(y), m(m), d(d) { }

答案 2 :(得分:0)

您需要在某处实现Date::Date(int, int, int)(即Date构造函数),如编译器明确指出的那样。 您可以通过向其添加正文来实现此目的,例如为其monthdayyear方法,或在类外部。

答案 3 :(得分:0)

您必须添加构造函数的实现(定义)

Date(int y, int m, int d);

目前在您的Date课程中只发出声明,导致此类情况

  

未定义引用`Date :: Date(int,int,int)&#39; collect2:错误:ld   返回1退出状态

http://ideone.com/wMgbKX