2012-02-23 4 views
1

が、私は私のプログラムでは、次の何かを持っていると言う、Inlineは関数/メソッドを現在のソースファイルのスコープに制限しますか?

// 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のをそれをインライン化するん/デストラクタ現在のソースファイル内にその使用を制限していますか?

インライン化は効率を向上させる単なる方法だと思いましたか?ツリー

ヘッダ・ファイルに定義され
Tree& Tree::operator+(Tree const& rhs); 

、およびソース・ファイル内の

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

ようmemeberメソッドを持っている場合、私はそれと少しを果たした、そしてそれはここで「インライン」らしい何

また、Tree :: operator +(...)をそのソースファイルのスコープに制限します

これは失敗することを意味します:

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

ここに示されているように:私はクラスツリーのCTOR /デストラクタから「インライン」を削除した後 Cannot create an instance of a class from another namespace?

、すべてがコンパイルされ、完全にリンク。

正確にインラインで何ができるのか説明してもらえますか?あなたはインラインとしての機能をマークすると

おかげで、

答えて

2

は、あなたはそれが使用されたすべてのソースファイルに含める必要があります。

C++ 11標準では、これと言っています

7.1.2/4:「インライン関数は、それが使用さODR-および正確でなければならないとしたすべての 翻訳単位で定義されなければなりませんどんな場合でも同じ定義が です。

+0

PFFは、あなたも、私は –

+0

ああ:)を折る、と私は、インライン関数は別個のユニットとしてコンパイルされていないことをどこかで読んしかし、段落を掘っに意味をなすように思わ呼び出し機能の一部として、私(インラインの全目的)。 –

+0

@BeyondSora、正確には、あなたのリンクがそれを見つけられない理由です。その効果は、**範囲が制限されているかのようです – davka

関連する問題