2011-02-09 151 views
0

我想實現一個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。

+0

你爲什麼要這麼做這個模板? –

+6

你的問題是**方式太長了**!這裏很少有人能夠無畏地完整地閱讀它! – Benoit

+0

你的類需要一個拷貝構造函數和一個拷貝賦值操作符。看到這個相關的[FAQ](http://stackoverflow.com/questions/4172722/)。 – fredoverflow

回答

5

有很多的問題與您的模板:

  • 到底是什麼的,整個事情的目的是什麼?
  • 你爲什麼用新的初始化指針?你知道編譯時的大小,爲什麼不把它們放到數組中呢?
  • 你是不是刪除,除非它被用於您實例氮很少值以後陣列
  • 實施大概應該是在頭文件中的一個,如果新的失敗,你都分配
  • 異常安全存儲
  • 最好使用存在該做這樣的事情,如升壓::數組
  • 重構出來的各個部分的類。
0

但是我正在尋找解決的辦法是 有一個模板類有 模板方法「LoopMethod」由於其 自己的模板參數,它告訴編譯器 多少次窩 換環

這是你在問:

template<int N> 
struct X 
{ 
    template<int M> 
    void loop(); 
}; 

template<int N> 
template<int M> 
void X<N>::loop<M>() 
{ 
} 
+0

看起來他希望使用模板大小來循環,因此他不需要兩個不同的模板參數值。他使用矢量,他將能夠知道他正在循環的收集的大小。 – CashCow

+0

是的,去圖... –