2015-02-24 2 views
2

Я прочитал много сообщений о LNK2019, но не могу решить эту ошибку.C++ LNK2019 неразрешенный внешний символ

Вот мой код:

time.h:

#ifndef PROJECT2_TIME_H 
#define PROJECT2_TIME_H 

#include<iostream> 
using std::ostream; 

namespace Project2 
{ 
class Time 
{ 
    friend Time& operator+=(const Time& lhs, const Time& rhs); 
    friend ostream& operator<<(ostream& os, const Time& rhs); 
public: 
    static const unsigned secondsInOneHour = 3600; 
    static const unsigned secondsInOneMinute = 60; 
    Time(unsigned hours, unsigned minutes, unsigned seconds); 
    unsigned getTotalTimeAsSeconds() const; 
private: 
    unsigned seconds; 
}; 

Time& operator+=(const Time& lhs, const Time& rhs); 
ostream& operator<<(ostream& os, const Time& rhs); 

} 

#endif 

Time.cpp:

#include "Time.h" 


Project2::Time::Time(unsigned hours, unsigned minutes, unsigned seconds) 
{ 
    this->seconds = hours*secondsInOneHour + minutes*secondsInOneMinute + seconds; 
} 

unsigned 
Project2::Time::getTotalTimeAsSeconds() const 
{ 
return this->seconds; 
} 


Project2::Time& 
Project2::operator+=(const Time& lhs, const Time& rhs) 
{ 
Time& tempTime(unsigned hours, unsigned minutes, unsigned seconds); 
unsigned lhsHours = lhs.seconds/Time::secondsInOneHour; 
unsigned lhsMinutes = (lhs.seconds/60) % 60; 
unsigned lhsSeconds = (lhs.seconds/60/60) % 60; 
unsigned rhsHours = rhs.seconds/Time::secondsInOneHour; 
unsigned rhsMinutes = (rhs.seconds/60) % 60; 
unsigned rhsSeconds = (rhs.seconds/60/60) % 60; 
return tempTime(lhsHours + rhsHours, lhsMinutes + rhsMinutes, lhsSeconds + rhsSeconds); 
} 

ostream& 
Project2::operator<<(ostream& os, const Time& rhs) 
{ 
unsigned rhsHours = rhs.seconds/Time::secondsInOneHour; 
unsigned rhsMinutes = (rhs.seconds/60) % 60; 
unsigned rhsSeconds = (rhs.seconds/60/60) % 60; 
os << rhsHours << "h:" << rhsMinutes << "m:" << rhsSeconds << "s"; 
return os; 
} 

main.cpp просто создает объекты Time и использует перегруженные операторы, похоже, не могут быть проблемы (эти коды предоставлены, поэтому сами по себе хороши) ,

Я попытался удалить «&» позади символа «Время», и я получил ту же ошибку.

А вот сообщение об ошибке:

Ошибка 1 ошибка LNK2019: неразрешенный внешний символ "класс Проект2 :: Время & __cdecl tempTime (беззнаковое целочисленное значение, беззнаковое целочисленное значение без знака целое)" (tempTime @@ YAAAVTime @ Project2 @@ III @ Z), на которые ссылается функция «класс Project2 :: время & __cdecl Project2 :: operator + = (класс Project2 :: время const &, класс Project2 :: время const &)" (?? YProject2 @ @ YAAAVTime @ 0 @ ABV10 @ 0 @ Z) c: \ Users \ Eon-Gwei \ documents \ visual studio 2013 \ Projects \ C++ III_Project2_GW \ C++ III_Project2_GW \ Time.obj C++ III_Project2_GW

+0

Этот символ не может связываться? Необходимо предоставить фактическое сообщение об ошибке. – Gadi

ответ

0

Time& tempTime(unsigned hours, unsigned minutes, unsigned seconds); объявляет функцию с именем tempTime и return tempTime(lhsHours + rhsHours, lhsMinutes + rhsMinutes, lhsSeconds + rhsSeconds); вызывает эту функцию. Поскольку функция не имеет реализации в любом месте, вы получаете ошибку компоновщика.

Поскольку operator += предположительно должен возвращать ссылку на объект, который он вызывается, вы должны изменить переменные-члены объекта через this, а не создавать новую Time и вернуть *this. Редактировать: любая нормальная реализация operator += изменит левый операнд вместо создания нового объекта. Я предлагаю вам пересмотреть, как должен работать ваш оператор.

+0

Спасибо! Я попытался изменить Time & lhs и вернуть его, и ошибка исчезла. –

+0

@aureus: Отлично! Примите это как ответ, так как он решил вашу проблему (в дополнение к тому, чтобы дать мне очки репутации, что не позволит другим людям думать, что этот вопрос все еще нуждается в ответе, и тратить время на это бесполезно). –

+0

Я пробовал раньше, но мне нужно 15 репутации для upvote ... –

Смежные вопросы