我想實現一個Base類,它具有我在編譯時已知的大小的屬性。所以我的想法是使用這個基類的模板。以下代碼在VC++ 9.0下編譯並運行良好。在.h文件C++模板問題
template<int N> class BaseClass
{
int* idx;
int* incr;
int* limit;
public:
BaseClass(void);
~BaseClass(void);
void LoopMethod(void);
}
類定義;
#include<cstdlib>
#include "BaseClass.h"
using namespace std;
int main()
{
BaseClass<2> baseObj;
baseObj.LoopMethod();
system("PAUSE");
return 0;
}
現在我要嵌套的for循環來源:
在.cpp文件
#include "BaseClass.h"
#include<iostream>
using namespace std;
// instantiation
template class BaseClass<2>;
template<int N> BaseClass<N>::BaseClass(void)
{
idx = new int [N];
incr= new int [N];
limit = new int[N];
for(int m = 0; m < N; m++)
{
idx[m] = 0;
incr[m] = 1;
limit[m] = 2;
}
}
template<int N> BaseClass<N>::~BaseClass(void)
{
}
template<int N> void BaseClass<N>::LoopMethod()
{
for(idx[N-1]; idx[N-1] < limit[N-1]; idx[N-1] += incr[N-1])
{
cout << "LoopMethod Nr " << N-1 << " is called." << endl;
}
}
主要功能的實現類的方法實現LoopMethod乘以類屬性的大小。即編譯器應該生成代碼,我會用手寫成
template<int N> void BaseClass<N>::LoopMethod()
{
for(idx[0]; idx[0] < limit[0]; idx[0] += incr[0])
{
for(idx[1]; idx[1] < limit[1]; idx[1] += incr[1])
{
cout << "LoopMethod Nr " << 1 << " is called." << endl;
}
cout << "LoopMethod Nr " << 0 << " is called." << endl;
}
}
反正,我可以提示編譯器要做到這一點,如果我不聲明BaseClass的是一個模板類。然後該代碼,這看起來像:
#include<cstdlib>
#include "BaseClass.h"
using namespace std;
int main()
{
BaseClass baseObj;
baseObj.LoopMethod<1>();
system("PAUSE");
return 0;
}
但解決:
class BaseClass
{
int* idx;
int* incr;
int* limit;
public:
BaseClass(void);
~BaseClass(void);
template<int M> void LoopMethod(void);
};
在.cpp文件類的方法實現
#include "BaseClass.h"
#include<iostream>
using namespace std;
template void BaseClass::LoopMethod<1>();
BaseClass::BaseClass(void)
{
idx = new int [2];
incr= new int [2];
limit = new int[2];
for(int m = 0; m < 2; m++)
{
idx[m] = 0;
incr[m] = 1;
limit[m] = 2;
}
}
BaseClass::~BaseClass(void)
{
}
template<int M> void BaseClass::LoopMethod()
{
for(idx[M]; idx[M] < limit[M]; idx[M] += incr[M])
{
cout << "LoopMethod Nr " << M-1 << " is called." << endl;
LoopMethod<M-1>();
}
}
template<> void BaseClass::LoopMethod<0>(void)
{
idx[0] = 0;
for(idx[0]; idx[0] < limit[0]; idx[0] += incr[0])
{
// do something
cout << "Now the inner loop is executed" << endl;
}
}
主要功能的實現我正在尋找的是擁有一個帶有模板方法「LoopMethod」的模板類,由於它自己的模板參數告訴編譯器多少次嵌套for-Loop。我嘗試了各種可能性,但沒有成功。有人有建議,甚至不知道這個模板問題的解決方案嗎?
在此先感謝您的幫助,
Markus。
你爲什麼要這麼做這個模板? –
你的問題是**方式太長了**!這裏很少有人能夠無畏地完整地閱讀它! – Benoit
你的類需要一個拷貝構造函數和一個拷貝賦值操作符。看到這個相關的[FAQ](http://stackoverflow.com/questions/4172722/)。 – fredoverflow