Ограничивает ли Inline функцию / метод областью действия своего текущего исходного файла? - PullRequest
1 голос
/ 23 февраля 2012

Скажите, что у меня в программе есть что-то следующее,

// namespaceB.h
#include "namespaceA.h"
namespace B {
class Tree {
    public:
    Tree *prev;
    Tree *next;
    Tree *down;
    A::Kind kind;

    Tree();
    ~Tree();
};
}
// end of namespaceB.h
// Implementation details of the class are placed in namespaceB.cc
// Constructor / Desctructor defined in the namespaceB.cc file!
// Something like this,
#include "namespaceB.h"
namespace B {
inline Tree::Tree() { ... }
inline Tree::~Tree() { ... }
}

Мой вопрос заключается в том, ограничивает ли использование ctor / dtor их использование в текущем исходном файле?

Я думал, что встраивание это просто способ повысить эффективность?

Что если у Tree есть метод memeber, такой как

Tree& Tree::operator+(Tree const& rhs);

определено в заголовочном файле и в исходном файле

inline Tree& Tree::operator+(Tree const& rhs) { ... }

Я немного поиграл с этим, и, похоже, здесь "inline" также ограничивает Tree :: operator + (...) областью действия этого исходного файла

, что означает, что это не удастся:

#include "namespaceB.h"
int main() {
B::Tree tree;    // Fail to link
return 0;    
}

Как показано здесь: Не можете создать экземпляр класса из другого пространства имен?

После того как я удалил «inline» из ctor / dtor класса Tree, все отлично скомпилировалось и связалось.

Может кто-нибудь объяснить, что именно делает inline?

Спасибо

1 Ответ

2 голосов
/ 23 февраля 2012

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

Стандарт C ++ 11 имеет следующее:

7.1.2 / 4: «Встроенная функция должна быть определена в каждом единица перевода, в которой она используется и должна иметь точно одно и то же определение в каждом случае. "

...