Невозможно встроить функции, даже если они помещены в заголовок c ++ - PullRequest
1 голос
/ 21 марта 2012

У меня проблемы с встраиванием функций-членов.Мой код выглядит следующим образом:

Main.cpp

#include "Foo.h"
int _tmain(int argc, _TCHAR* argv[])
{
    Foo foo;
    int a = foo.myInlinedFunc(2);
}

Foo.h

class Foo
{
public:
    Foo(void);
    ~Foo(void);
    inline int myInlinedFunc(int value);
};

Foo.cpp

#include "Foo.h"
Foo::Foo(void)
{
}
Foo::~Foo(void)
{
}
int Foo::myInlinedFunc(int value)
{
    return value * value;
}

Я получаюследующая ошибка:

Tester.obj: ошибка LNK2019: неразрешенный внешний символ "public: int __thiscall Foo :: myInlinedFunc (int)" (? myInlinedFunc @ Foo @@ QAEHH @ Z), на который есть ссылка в функции_wmain 1> E: \ Debug \ Tester.exe: фатальная ошибка LNK1120: 1 неразрешенные внешние данные

Я искал ответы в Google, но единственные ответы, которые появляются, говорят мне, что я должен поставитьвстроенное ключевое слово в заголовочном файле, где оно уже есть.

Ответы [ 4 ]

10 голосов
/ 21 марта 2012

Вам нужно поместить тело функции, то есть определение, в файл заголовка.

Ваш заголовок должен выглядеть так:

Foo.h

class Foo
{
public:
    Foo(void);
    ~Foo(void);
    inline int myInlinedFunc(int value)
    {
        return value * value;
    }
};

И, естественно, вы также должны удалить определение myInlinedFunc из Foo.cpp.

Или, если хотите, вы можете написать свой код заголовка следующим образом:

Foo.h

class Foo
{
public:
    Foo(void);
    ~Foo(void);
    int myInlinedFunc(int value);
};

inline int Foo::myInlinedFunc(int value)
{
    return value * value;
}

Но суть в том, что если вам нужна встроенная функция, доступная для других единиц перевода, ее определение должно быть помещено в заголовочный файл.

FAQ по C ++ объясняет это и даже предсказывает вашу неразрешенную внешнюю ошибку.

0 голосов
/ 17 октября 2014

Вы можете сделать 1 из 2 способов

  1. Поместите определение встроенной функции (в вашем примере это myInlinedFunc) в заголовочный файл

  2. Если вы хотите поместить определение функции в другой файл, добавьте следующую строку в конец файла заголовка

#include "Foo.cpp"

И в Foo.cpp добавить эту строку вверху файла

#include "Foo.h"

0 голосов
/ 21 марта 2012

Источник определений функций должен быть доступен для компилятора, если вы хотите, чтобы они были встроены.Вы можете сохранить его в заголовке или в файле .cpp, который вы включаете в заголовок.

Например, это будет Foo.h

#ifndef Foo_h
#define Foo_h

class Foo
{
public:
    Foo(void);
    ~Foo(void);
    inline int myInlinedFunc(int value);
};

#include "Foo.cpp"
#endif Foo_h

Вы можете сохранитьопределение функции в Foo.cpp

inline int Foo::myInlinedFunc(int value)
{
    return value * value;
}

Чтобы использовать класс, просто включите Foo.h там, где он вам нужен.Вам не нужно отдельно компилировать Foo.cpp.

0 голосов
/ 21 марта 2012

Если вы хотите поделиться встроенной функцией (быть пригодной для использования вне класса, в котором она находится), функция должна идти в заголовок. Не нужно идти в верхнюю часть заголовка. Поместите его вне объявления класса, но в том же файле * .h.

...