С++ LNK2019 неразрешенный внешний символ

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

Вот мой код:

Время.ч:

#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

Время.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: неразрешенный внешний символ "class Project2::Time & __cdecl tempTime(unsigned int,unsigned int,unsigned int)" (?tempTime@@YAAAVTime@Project2@@III@Z), на который ссылается функция "class Project2:: Time & __cdecl Project2::operator+=(class Project2::Time const &,class Project2::Time 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


person run run chicken    schedule 24.02.2015    source источник
comment
какой символ не связывается? Вам необходимо предоставить фактическое сообщение об ошибке.   -  person Gadi    schedule 24.02.2015


Ответы (1)


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

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

person Aasmund Eldhuset    schedule 24.02.2015
comment
Спасибо! Я попытался изменить Time & lhs и вернуть его, и ошибка исчезла. - person run run chicken; 24.02.2015
comment
@aureus: Отлично! Пожалуйста, примите это как ответ, поскольку он решил вашу проблему (помимо того, что я дал мне очки репутации, это не позволит другим людям думать, что на этот вопрос все еще нужно ответить, и тратить на него время без необходимости). - person Aasmund Eldhuset; 24.02.2015
comment
@aureus: я считаю, что вы все еще можете принять ответы, что отличается от голосования. (Но я поставил вам плюс, так что теперь вам не хватает только 4 баллов ;-)) - person Aasmund Eldhuset; 24.02.2015
comment
Спасибо за голосование! Теперь у меня 6 репутации и 2 бронзовых значка. - person run run chicken; 25.02.2015
comment
Я только что обнаружил, что могу принять ваш ответ. Спасибо, Осмунд. - person run run chicken; 05.02.2016