2011-01-03 2 views
1


私はメソッドが追加された公開されているテンプレートクラスを持っています。このクラスは名前空間Aにあります。今、私は別の名前空間(たとえばB)でこのメソッドを呼び出しています。最初に、コンパイラは、この特定のメソッドの「未解決の外部シンボル」と言ってリンカエラーを出しました。
しかし、このメソッドを同じ名前空間(つまりA)の中に呼び出すと、このメソッドはうまくリンクします。その後、名前空間Bでもうまくリンクします。
なぜこれが起こりうるのですか?
これは、私のクラスのテンプレート作成オブジェクトと関係がありますか?
アトゥール
ここでは、私は名前空間B内からこのメソッドを呼び出すいた場合、それは私が名前空間A内からこれを呼び出すときに、未解決の外部シンボルを与えるが、リンカーエラーを与えるテンプレートクラス

namespace sss 
{ 
    namespace AAA 
    { 
     template <<typename T, typename TAlloc = Allocator<T> > 
     class DLL_EXPORT A 
     { 
      public: 
      // Some other functions that are working fine ... 
      bool fooA() const; 
      { 
        return Size()>0; 
      } 
     }; 
    } 
} 


//I get a linker error when I call it in another namespace (say B)... 
//I am accessing this method in public method of some other class in namespace B 

// Including the header for class A ... 
#include A.h 

namespace QQQ 
{ 
    namespace B 
    { 
     class B 
     { 
      private: 
      AAA::A obj; // Object of class A ... 
      public: 
      // SOme methods 
      // Method that calls fooA ... 
      GetResult() 
      { 
       fooA // This causes causes linker error when i call it here, 
        // but, it works when i call it in namespace AAA, 
        // and then it, it works here as well 
      } 
     }; 

、それがリンク...コードスニペットですよくAで、Bで再び。
アイデア

+0

これを示す最小のコード例を提供できますか? –

+0

コードを表示できますか? – UmmaGumma

+2

私はちょうどtemplaet名前空間を意味するのだろうか? – UmmaGumma

答えて

0

テンプレート化されたクラスが正しく使用されていません。以下は動作するはずです:私はこのコードを想像することができます

namespace QQQ 
{ 
    namespace B 
    { 
     class B 
     { 
      // Note the template parameter (int) 
      AAA::A<int> obj; 

      public: 
      bool GetResult() const 
      { 
       // Note the parentheses and the "obj" 
       return obj.fooA() 
      } 
     }; 
    } 
} 

唯一の問題はB名前空間とBクラス間のあいまいさになるが、完全修飾されたコール(QQQ::B::B)が動作するはずです。あなたの症状(A以外の名前空間から呼び出されたリンカエラー、だけでなく、名前空間Aから呼び出された場合は、noリンカエラー)によると


、そして - あなたの構文は、あなたの実際のコードで正しいと仮定 - あなたの問題は、テンプレートを正しくインスタンス化していないことです。テンプレートはコンパイル時の構造体なので、実際にDLLにコンパイルすることはできません。代わりに、テンプレートはコンパイル時に正しくインスタンス化する必要があります。リンクエラーが発生しない場合は、テンプレートが正しくインスタンス化されているためです。リンクエラーが発生した場合は、リンクエラーが発生していないためです。

DLL_EXPORTシンボルのため、私はあなたがVisual C++を使用していると仮定します。それでも、GCCの人はgood write-upをVisual Studioにも適用します。私がよく知っているほとんどのテンプレートライブラリ(Boostなど)では、すべてのテンプレートをヘッダファイルで宣言して定義する必要があります。また、GCCの推薦を受けて、テンプレートを明示的にインスタンス化することも正当です。

0

私は、Borland 5 Professionalと同じ問題がありました。私は外部参照メッセージでリンカエラーが発生しました。解決策は、ヘッダーの末尾に.cppファイルを含めることでした。コンパイラはテンプレートをインスタンス化できるように完全な定義を持つ必要があるためです。 したがって、使用する翻訳単位で定義する必要があります。

希望するものがあります。

関連する問題