Скажите, что у меня в программе есть что-то следующее,
// 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?
Спасибо