Ошибка ссылки "ld: fatal: Symbol ссылаются на ошибки."

Я все еще учу С ++ и следую примеру из моей книги. Я в основном скопировал их код и добавил к ним пространство имен. Что я делаю неправильно?

Код:

#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 ответа

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

Сообщение об ошибке сигнализирует (по общему признанию неясным способом), что нет никакого определения для Date, Это объявлено, но не определено. Вы не указали, что делает конструктор.

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

Или, лучше, используя синтаксис списка инициализатора:

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

Вы должны добавить реализацию (определение) конструктора

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

На данный момент в вашем объявлении найдена только декларация Date класс и такая ситуация приводит к

неопределенная ссылка на `Date::Date(int, int, int)' collect2: error: ld вернул 1 состояние выхода

http://ideone.com/wMgbKX

Вам необходимо реализовать Date::Date(int, int, int) (т.е. Date конструктор) где-то, как явно указано вашим компилятором. Вы можете сделать это, добавив к нему тело, как для его month, day а также year методы, или вне класса.

Вы объявили Date::Date конструктор, но никогда не определял его.

Ваша декларация - это обещание компилятору, что конструктор Date::Date будет определен где-то. Но вы никогда не давали определение. Вот что вызывает ошибку.

Вы можете предоставить определение прямо внутри определения класса, как вы делали это с другими функциями-членами. Или вы можете дать определение за пределами класса. Это тебе решать. Но определение должно быть предоставлено где-то.

Другие вопросы по тегам