C++字符串常量做为模板实参?

Hongdeo 2010-05-20 04:23:35
C++字符串常量做为模板实参为什么不可以。小弟新手,请各位大侠不吝赐教!
...全文
542 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsj5158fk 2010-05-20
  • 打赏
  • 举报
回复
han3
windsting 2010-05-20
  • 打赏
  • 举报
回复
很简单,因为无法保证在不同的编译单元内,相同内容的字符串都被实力化成相同的类,
你应该知道,在模板实参(你的字符串)替换形参(你的<>中的char*)的时候,
比方说有两个文件:

//CharPtrTemplate.h
#ifndef CharPtrTemplate_H
#define CharPtrTemplate_H
#include <iostream>
template<const char* TP>
class CPT
{
const char* m_sz;
public:
CPT(const char* p):m_sz(p){}
void Print(void)
{
std::cout<<"the sz is("<<m_sz<<"),and the ptr value is("<<(int)m_sz<<")\n";
}
};
void InstanceA(void);
void InstanceB(void);
#endif

//a.cpp
#include "CharPtrTemplate.h"
void InstanceA()
{
CharPtrTemplate<"xxx"> a;
a.Print();
}

//b.cpp
#include "CharPtrTemplate.h"
void InstanceB()
{
CharPtrTemplate<"xxx"> b;
b.Print();
}


假设你写了一个main函数分别调用InstanceA和InstanceB,输出的结果是:
the sz is(xxx),and the ptr value is(40012340)";
the sz is(xxx),and the ptr value is(40012540)";

你认为,编译器应该给a、b算作是同一个类的对象(可以按照默认语意互相赋值),
还是不同类型的对象呢??如果写出了这样的代码,显然coder希望这是的相同类型,
问题是,编译器怎么才能知道 40012340 和 40012540 这两个地址有什么关联呢??
我说明白了么?????
Hongdeo 2010-05-20
  • 打赏
  • 举报
回复
谢谢各位,呵呵 ,但是我想知道为什么这么写不成。呵呵。有没有进一步说明原因的?
zenny_chen 2010-05-20
  • 打赏
  • 举报
回复
呵呵,教楼主一个简单的办法:

template<unsigned>
class T{};

T<(unsigned)"Hello"> t1;
T<(unsigned)"Hi"> t2;
macrojj 2010-05-20
  • 打赏
  • 举报
回复
模板特化????
Hongdeo 2010-05-20
  • 打赏
  • 举报
回复
template<char const * strname>
class T{};

这么写 T<"xxx"> t;也不行?不知道其中有什么奥秘。
redleaves 2010-05-20
  • 打赏
  • 举报
回复
字符串编译后变成了地址...可能引起一些小问题.
所以不推荐用字符串做模板参数.但并不是不行.
如果非要用字符串.只能用有确定地址的字符串.而不是这种临时字符串(这种字符串的地址在编译时还不确定,无法做模板参数).
比如:
extern char name[];
template < char * _T >
class T{}
T<name> t;
Hongdeo 2010-05-20
  • 打赏
  • 举报
回复
因为我是看了C++ Templates 中说的模板实参不能是字符串常量,不能理解,特此请教!形如
template<char * strname>
class T{};
为什么不能这么写 T<"xxx"> t;
lirg8405 2010-05-20
  • 打赏
  • 举报
回复
字符串常量传进去的时候是const char*
Hongdeo 2010-05-20
  • 打赏
  • 举报
回复
因为我是看了C++ Templates 中说的模板实数不能是字符串常量,不能理解,特此请教!形如
template<char * strname>
class T{};
为什么不能这么写 T<"xxx"> t;
十八道胡同 2010-05-20
  • 打赏
  • 举报
回复
举个例子?
one2zero 2010-05-20
  • 打赏
  • 举报
回复
是啊 你模板参数怎么设置的啊,。。。。
we_sky2008 2010-05-20
  • 打赏
  • 举报
回复
模板参数类型是什么呢?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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