Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Именованный конструктор + inline

23K
19 августа 2011 года
Spice
37 / / 10.07.2008
Приветствую, Форумчане!

Следующий код, оформленный в одном файле работает на ура.
Код:
class Point2
{
public:
    static Point2 Decar(double dX, double dY);
    static Point2 Polar(double angle, double radius);
private:
    double dX;
    double dY;
    Point2(double dX, double dY);
};

inline Point2::Point2(double dX, double dY): dX(dX), dY(dY)
{
}
inline Point2 Point2::Decar(double dX, double dY)
{
    return Point2(dX, dY);
}
inline Point2 Point2::Polar(double angle, double radius)
{
    return Point2(radius * cos(angle), radius * sin(angle));
}

void main()
{
    Point2 point2 = Point2::Decar(1, 2);
    return;
}


Если же объявление класса вынести в отдельный заголовочный файл,
Код:
class Point2
{
public:
    static Point2 Decar(double dX, double dY);
    static Point2 Polar(double angle, double radius);

private:
    double dX;
    double dY;

    Point2(double dX, double dY);
};

а определение в отдельный cpp файл,
Код:
inline Point2::Point2(double dX, double dY): dX(dX), dY(dY)
{
}
Point2 Point2::Decar(double dX, double dY)
{
    return Point2(dX, dY);
}
Point2 Point2::Polar(double angle, double radius)
{
    return Point2(radius * cos(angle), radius * sin(angle));
}

и затем проинклудить заголовочный файл, то линкер начинает ругаться на следующий код:
 
Код:
void main()
{
    Point2 point2 = Point2::Decar(1, 2);
    return;
}

Error 1 error LNK2019: unresolved external symbol "public: static class Point2 __cdecl Point2::Decar(double,double)" (?Decar@Point2@@SA?AV1@NN@Z) referenced in function _main E:\Coding\C++\Win32\Named Constructor Idiom\MainUnit.obj

Отказ от спецификатора inline решает вопрос, но так и не дает понять причину такого поведения.
У кого-нибудь есть вразумительное объяснение?
14
19 августа 2011 года
Phodopus
3.3K / / 19.06.2008
3.2.3
Цитата:
Every program shall contain exactly one definition of every non-inline function or object that is used in that
program; no diagnostic required. The definition can appear explicitly in the program, it can be found in the
standard or a user-defined library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8).
An inline function shall be defined in every translation unit in which it is used.

23K
20 августа 2011 года
Spice
37 / / 10.07.2008
Цитата: Phodopus
3.2.3


Спасибо, вы ответили на мой вопрос.
Для тех кто не дружит с английским:
"Инлайн-функция должна быть определена в той же единице трансляции, где используется"

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог