2012-05-07 10 views
0

私は次のようにテンプレートクラスを使用したいという標準の状況があります。VS 2011のテンプレートクラス

  1. を.hファイル
  2. を定義し、それが.cppの
が含ま持っています

私が試した他のコンパイラ(g ++やclang/llvmなど)ではこれがうまく動作します。 Visual Studioでは、ファイルがすでに定義されていることがわかります。

手動で.cppのテキストを.hファイルにカットアンドペーストすると、すべて正常に機能します。私はそれがちょうど#includeがやろうとしていたことだったという印象を受けました。

私の勘違いは、ビジュアルスタジオが.hppファイルと.cppファイルに#pragma onceを配置したにもかかわらず、何とか何度も.cppファイルをコンパイルしていることです。

何が起こっているのですか、テンプレートクラスをVSで動作させるにはどうしたらいいですか?

コードは次のとおりです。
.H:

#pragma once 
template <class T> 
class myVector 
{ 
private: 
    void grow(); 
public: 
int size; 
int index; 
T** words; 
void pushBack(T* data); 
inline T* operator[](int); 
myVector(void); 
~myVector(void); 
}; 

#include "myVector.cpp" 

た.cpp:

#pragma once 
#include "stdafx.h" 
#include <cstdlib> 
#include "myVector.h" 
#include <iostream> 
using namespace std; 

template<class T> 
myVector<T>::myVector(void) 
{ 
    this->size = 2000; 
    words = new T*[size]; 
    index=0; 
} 

template<class T> 
void myVector<T>::pushBack(T* input) 
{ 
    if(index<size) 
    { 
     words[index]=input; 
    } 
    else 
    { 
     grow(); 
     words[index]=input; 
    } 
    index++; 
} 

template<class T> 
T* myVector<T>::operator[](int i) 
{ 
    return words[i]; 
} 

template<class T> 
void myVector<T>::grow() 
{ 
    //cout<<"I grew:"<<endl; 
    size*=2; 
    words = (T**)realloc(words,size*sizeof(T*)); 
} 

template<class T> 
myVector<T>::~myVector(void) 
{ 
    delete[] words; 
}  
+0

AFAIKテンプレート宣言と定義を分離するのは悪い習慣と考えられます。少なくとも.cppは使用しないでください.tppを使用してください。せいぜい、宣言する場所を定義してください。それはあなたとコンパイラの両方にとってはあまり働きません。 – GManNickG

答えて

2

あなたの混乱がどのように#pragma onceと翻訳単位の仕事を知らないから生じるように私には思えます。

#pragma onceは、ファイルの内容(通常はヘッダー)が1つの翻訳単位に2回以上引っ張られないように、ガードを組み込むのと同じです。

複数のインプリメンテーションファイルで#include <vector>を使用すると、すべてのコンテンツがプルされますが、トランスレーションユニットごとに1回だけ取り込まれます。

#include "myVector.cpp"を削除する必要があります.MSVSは自動的に実装ファイルをコンパイルするため、間違っています。

あなたがやったように、.hファイルに移動するか必要がありますので、テンプレート定義は、見えるように持っていることを注意、または、あなたの現在のアプローチを使用して、.implあるいは.hのようなものに.cppファイルの名前を変更し、それを含める。

+0

私はかなり混乱しています。私は現在、 '#include" myVector.h "' 'not' #include 'を使用しています。' #include "myVector.cpp"を削除すると、リンカエラーが発生します(他の回答へのコメント参照)。そしてファイルの拡張子はVSにとって重要ですか?ファイル名をmyVector.implに変更すると、.hに含まれるインクルードを保持していれば動作します。 – soandos

+0

@soandosはい、拡張が重要です。 '#include 'は単なる例にすぎません。 –

関連する問題