C ++模板问题

时间:2011-02-09 09:27:50

标签: c++ templates

我想实现一个Base类,其属性大小我在编译时已经知道。所以我的想法是为这个Base类使用一个模板。以下代码在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循环嵌套到类属性的大小。即编译器应该生成一个我用Hand编写的代码

 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多少次。我尝试了各种可能性但没有成功。有没有人建议甚至知道这个模板问题的解决方案?

先谢谢你的帮助,

马库斯。

2 个答案:

答案 0 :(得分:5)

您的模板存在很多问题:

  • 整件事的目的究竟是什么?
  • 为什么要使用new初始化指针?你知道编译时的大小,为什么不让它们成为数组呢?
  • 您没有删除正在分配的内存
  • 如果新的某个后续数组失败,则异常安全
  • 实现可能应该在头文件中,除非它用于实例化N的极少数值
  • 最好使用存在这类事物的类,例如boost :: array
  • 重构其中的各个部分。

答案 1 :(得分:0)

  

但我正在寻找的解决方案是   有一个模板类   由于它的模板方法“LoopMethod”   自己的模板参数告诉了   编译器嵌套多少次   for循环

这就是你要问的:

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

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