2017-07-20 4 views
0

を取得します。別のプロジェクトに同じコードがあり、LINK2019エラーが発生します。 私がしたこと: 他のすべてのファイルを削除し、いくつかのテスト.hと.cppファイルを保存し、他のファイルやコードとの干渉を避けるために新しいプロジェクトを開きました。私はまだLINK2019エラーが発生します! 別のプロジェクトでも同様の例がありますが、ここで何か不足していると思います。テンプレートを関数/メソッドに変更すると、単純化されたプロジェクトではLINK2019を取得しません。別々の宣言と実装は時々動作し、時々私は、テンプレートを使用してコード(C++)を持っており、それが動作リンカエラー

私は、エラーメッセージと以下のコードを置きます。あなたは、私が行方不明です何を見ることができた場合は私に知らせてください:

エラー: 重大度コード説明プロジェクトファイルの行の抑制状態 エラーLNK2019未解決の外部シンボル「パブリック:無効__thiscall TestUnit ::メソッド(クラスTestIO)」(? ?$ Method @ VTestIO @@@ TestUnit @@ QAEXVTestIO @@@ Z)関数_mainで参照されるリンク問題のテストI:\ Me \ My C++ \サイズモジュール\プロセス装置サイジング\リンク問題のテスト\リンク問題のテスト\ MAIN.OBJ 1

コード: MAIN.CPP

 #include "TestIO.h" 
     #include "TestUnit.h" 
     #include <iostream> 
     using namespace std; 

     int main() 
     { 
     TestUnit TU100; 

     TestIO TestIO100; 
     TU100.Method(TestIO100); 
     //TU100.Method<TestIO>(TestIO100); 
     //TU100.function();//This works! 

     system("pause"); 
     return 1; 
     } 

///////// ///////////////////////////////////////

TestUnit.h

 class TestUnit 
    { 
      public: 
     TestUnit(); 
     virtual ~TestUnit(); 

     template <class T> 
     void Method(T IO); 

     void function(void); 

    }; 

/////////////////////////////////////////////// /////////// TestIO.h

  class TestIO 
      { 
       public: 
      TestIO(); 
      virtual ~TestIO(); 

      double pressure = 1000; 

      }; 

//////////////////////////// //////////////// TestIO.h

 #include "TestIO.h" 
    TestIO::TestIO() {} 
    TestIO::~TestIO() {} 

/////////////////////////////////////////////////////////////////////////コンパイラが使用するつもりだ何テンプレートパラメータわからないため///////// TestUnit.cpp

 #include "TestUnit.h" 
     #include <iostream> 
     using namespace std; 

     TestUnit::TestUnit() {} 
     TestUnit::~TestUnit() {} 

     template <class T> 
     void TestUnit::Method(T IO) 
     { 
     cout << "In the template: Salute to C++!!!" << endl; 

     //cout << "Here in TestUnit Pressure: " << IO.pressure << endl; 

     } 

     void TestUnit::function(void) 
     { 
     cout << "We love C++ !!!" << endl; 
     } 

答えて

0

テンプレートメソッドは、.cppファイルに行くことができません。代わりにそれを.hファイルに入れて、それを呼び出す場所に定義します。

+0

は、私はすでに時間のファイルで宣言され、CPPファイルに定義されたテンプレートメソッドと同様のプログラムを持っており、それは、コンパイルとリンクし、それが働いていている両方。また、私はcppファイル内にあるこの作業コードのバージョンを持っており、動作しています。必要に応じてここに作業コードを渡すことができます。私はこのエラーの原因となる小さなものが欠けていると思う。エラー2019の定義によれば、一致していないものがあるはずです! –

+0

私は、テンプレートの宣言と定義がすべてcppファイル内にあり、動作するという例があります!!!!!! –

+0

@EricA定義と呼び出しの両方が同じ.cppファイル内にあり、関数定義が呼び出しの前に来る場合は正常に動作します。あなた自身に尋ねる質問は、関数呼び出しに到達した時点でコンパイラは何を知っていますか? –

関連する問題