私は次のようにテンプレートクラスを使用したいという標準の状況があります。VS 2011のテンプレートクラス
- を.hファイル
- を定義し、それが.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;
}
AFAIKテンプレート宣言と定義を分離するのは悪い習慣と考えられます。少なくとも.cppは使用しないでください.tppを使用してください。せいぜい、宣言する場所を定義してください。それはあなたとコンパイラの両方にとってはあまり働きません。 – GManNickG