簡體   English   中英

C ++模板問題

[英]C++ template problem

我想用在編譯時就已經知道的大小的屬性來實現一個基類。 所以我的想法是為該基類使用模板。 以下代碼可以在VC ++ 9.0下編譯並正常運行。

.h文件中的類定義

template<int N> class BaseClass
{
int* idx; 
int* incr; 
int* limit;


public:
BaseClass(void);
~BaseClass(void);

void LoopMethod(void);

};

.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;
}

}

主要功能的實現:

#include<cstdlib>
#include "BaseClass.h"

using namespace std;


int main()
{
BaseClass<2> baseObj;

baseObj.LoopMethod();


system("PAUSE");
return 0;

}

現在,我想嵌套來自LoopMethod的for循環乘以類屬性的大小。 即編譯器應生成我將手工編寫的代碼

 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聲明為模板類,則可以提示編譯器執行此操作。 這樣的代碼將如下所示:

 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;

}

 }

主要功能的實現:

#include<cstdlib>
#include "BaseClass.h"

using namespace std;


int main()
{
BaseClass baseObj;

baseObj.LoopMethod<1>();


system("PAUSE");
return 0;
 }

但是我正在尋找的解決方案是擁有一個帶有模板方法“ LoopMethod”的模板類,這歸功於它自己的模板參數,該參數告訴編譯器將for-Loop嵌套多少次。 我嘗試了各種可能性,但沒有成功。 是否有人對這個模板問題有建議甚至知道解決方案?

在此先感謝您的幫助,

馬庫斯。

您的模板有很多問題:

  • 整件事的目的到底是什么?
  • 為什么用new初始化指針? 您知道編譯時的大小,那么為什么不只將它們設置為數組呢?
  • 您不會刪除正在分配的內存
  • 如果新的失敗后的陣列之一異常安全
  • 實現可能應該在頭文件中,除非它用於實例化的N的極少值
  • 最好使用存在的可以執行此類操作的類,例如boost :: array
  • 重構其中的各個部分。

但是我正在尋找的解決方案是擁有一個帶有模板方法“ LoopMethod”的模板類,這歸功於它自己的模板參數,該參數告訴編譯器將for-Loop嵌套多少次。

那是你在問什么:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM