虚心请教, 非类型模板参数 如何使用!?

mdzhao 2006-03-19 09:07:19
c++Primer上说:绑定给非类型参数的表达式必须是一个常量表达式. 并给了如下例子:

我在vc6和Dev C++ 4中都编译不过. 不知道参数该如何写

template <int *ptr> class BufPtr { };

int size_val = 1024;
const int c_size_val = 1024;
BufPtr< &size_val > bp0; // 编译不过
...全文
156 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Force200413 2010-06-14
  • 打赏
  • 举报
回复
回5楼:

#include <iostream>
using namespace std;

template<int* ptr>
int fun(){return *ptr;}
int Ia = 1;
int main()
{
int Ib = 1;
static int Ic = 1;
fun<&Ia>(); // 通过编译
fun<&Ib>(); // Ia不是全局变量,也不是静态变量,因此它的地址只有运行期才知道,
// 而模板参数必须要在编译期就知道
fun<&Ic>(); // 也不能通过编译??????不符合5楼的描述
return 0;
}

Jinhao 2006-03-20
  • 打赏
  • 举报
回复
template <int *ptr> class BufPtr { };

int main()
{
int size_val = 1024;
const int c_size_val = 1024;
BufPtr< &size_val > bp0; // 编译不过
}

是因为函数main在栈位置是不固定的。所以size_value的位置也不是固定的。那么size_val的地址在编译时是不知道的

template <int *ptr> class BufPtr { };

int main()
{
static int size_val = 1024;
BufPtr< &size_val > bp0; // 编译可以通过
}
当size_val被定义为静态变量时,它会被编译器安排在一个固定的位置上,所以在编译时刻,它的地址是知道的。所以BufPtr的参数 &size_val是可以确定的

同理,下面代码也可以通过编译
template <int *ptr> class BufPtr { };

int size_val = 1024;
int main()
{

BufPtr< &size_val > bp0; // 编译可以通过
}

总之,非类型模板参数必须是一个在编译时刻就知道的整数常量
mdzhao 2006-03-20
  • 打赏
  • 举报
回复
问题解决了, 谢谢 Jinhao(辣子鸡丁)
bluejugar 2006-03-19
  • 打赏
  • 举报
回复
一楼正解.

template <int *ptr> class BufPtr { };

int size_val = 1024;
const int c_size_val = 1024;
BufPtr< &size_val > bp0; // 编译不过

在某种意义上讲,因为是静态展开,模板参数主要用于帮助编译器生成类型信息.
太多的模板的使用还会延长编译时间.
像上面这种场合,如果不是刻意的要根据长度来区分不同的类型的话,将参数放进构造函数就行了.

shenmea00000 2006-03-19
  • 打赏
  • 举报
回复
不太明白~~~~~
逸学堂 2006-03-19
  • 打赏
  • 举报
回复
template <int ptr> class BufPtr { }; // ptr是一个常量。

const int size_val = 1024;
const int c_size_val = 1024;
BufPtr<1024> bp0; // 注意此处,必须传递一个常量过去,直接写1024,或者写
// const int size_val.这时候传递BufPtr<size_val> bp0;

BTW:模板是编译时刻展开实例的,所以不要考虑在运行时刻创建一个模板的实例。
所以模板要求int类型必须是一个常量,一旦初始化,在整个程序中就不可修改。

mdzhao 2006-03-19
  • 打赏
  • 举报
回复
谢谢两位的解答

不过我上面写的是使用 int * ,而不是int.

template <int *ptr> class BufPtr { };

还有, 我要在我的程序中这样应用. 难道对于指针就没有办法推演吗?
template<typename T, const char* lpszFormat, int nSize = 8> class MyClass{}
其实用别的方法实现也行, 不过lpszFormat是对T的描述, 我觉得使用非类型参数最好, 因为T的类型定了, lpszFormat也就定了.

5,531

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧