问一下模板的非类型指针形参的实例化问题

kiffa 2009-05-11 04:13:43
看基础书看到模板了,有个问题:

template<class T, char *p>
void f(){ }


这种模板函数怎么实例化?
char *p 要求常量表达式,但我想不出怎样写一个常量的指针表达式:

f<int, 0>();            // error

f<int, (char*)0>(); // error: 除了转换为整型或者enum,其它的类型转换不能用在常量表达式中

char *const p = 0;
f<int, p>(); // error: p不能出现在一个常量表达式中

f<int, "haha">(); // error: "haha"不是一个合法的模板实参,因为字符串字面值永远不能用在这种上下文中。



...全文
193 点赞 收藏 10
写回复
10 条回复
zenny_chen 2009年05月12日



f<int, (char*)0>(); // error: 除了转换为整型或者enum,其它的类型转换不能用在常量表达式中

char *const p = 0;
f<int, p>(); // error: 对于p,必须有常量值

f<int, "haha">(); // error: "haha"一个模板实参不能引用一个非外部实体



extern char g_s[] = "haha";

int main(void)
{
f<int, NULL>(); // 在VC++2008中可以通过
f<int, g_s>(); //因为你的模板形参原本没有const修饰,所以这里外部变量g_s也不用const修饰。
// 如果用了const修饰的话需要进行显示的类型转换
}
回复 点赞
kiffa 2009年05月12日
[Quote=引用 7 楼 taodm 的回复:]
楼主代码的出处?
[/Quote]

自己想的,因为看到《c++ primer》(第四版,16.4.2节)关于模板的非类型形参这部分,然后我就想什么样的东西才可以做非类型参数,书上只是简单提到了“非类型模板实参必须是编译时的常量表达式”,我就拿各种东西来试验,就有了上面的问题。

这是我的习惯之一,-_-,我看书看完某节内容开头的概要后,会自己想很多东西来测试,会写很多代码来看结果,然后尽可能自己思考一下为什么会有这样的结果,往往会产生很多疑问,在这之后才带着问题去看书求证。因为这次产生的问题primer上没说,关于模板的几本书我又不熟悉具体内容组织,就直接上论坛问了。

我后面翻阅了《c++ templates》,才知道了“模板的非类型参数一般只能是整型常量,包括enum,或者是指向外部链接的对象的指针”。书上还提到了浮点常量和字符串常量相关的一些内容,比primer要细很多。
回复 点赞
hjjdebug 2009年05月12日
[Quote=引用 8 楼 kiffa 的回复:]
引用 7 楼 taodm 的回复:
楼主代码的出处?


自己想的,因为看到《c++ primer》(第四版,16.4.2节)关于模板的非类型形参这部分,然后我就想什么样的东西才可以做非类型参数,书上只是简单提到了“非类型模板实参必须是编译时的常量表达式”,我就拿各种东西来试验,就有了上面的问题。

这是我的习惯之一,-_-,我看书看完某节内容开头的概要后,会自己想很多东西来测试,会写很多代码来看结果,然后尽可能自己思考一下…
template<class T, char *p> void f(){ }
[/Quote]
我也帮你想一个问题, 模板类型class T, 我们可以用在函数中声明一个T型变量,
你这里定义一个char *类型, 有什么用途啊 ?
是不是可以忽略呀,要声明char *, 直接用就是了。
回复 点赞
taodm 2009年05月11日
楼主代码的出处?
回复 点赞
woods2001 2009年05月11日
帮顶
楼上都是正解呢~
回复 点赞
yshuise 2009年05月11日
38页。要书不离手。哈哈。
回复 点赞
kiffa 2009年05月11日
果然还是我看书少的原因,我前段时间才接触模板,所有的模板知识都来源于《c++ primer》。

而像《c++ templates》啊、《MCD》啊、还在遥远的计划中。

感谢一下2楼,总算能通过编译了。我刚才翻阅了一下《c++ templates》的目录,只找到了关于“为什么模板不能用字符串字面值作为参数”的章节,但没有找到你给出的代码相关的章节,方便的话就告知一下具体的章节,我再去看看。
回复 点赞
pathuang68 2009年05月11日
[Quote=引用 2 楼 yshuise 的回复:]
晕《c++ templates》已经指出:

C/C++ codetemplate<char const* p>
class ET{};
extern char const s[] = "good";
ET<s> F;
[/Quote]
赞一个
回复 点赞
yshuise 2009年05月11日
晕《c++ templates》已经指出:
template<char const* p>
class ET{};
extern char const s[] = "good";
ET<s> F;
回复 点赞
adventurelw 2009年05月11日
"hello"

这就是常量表达式。
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告