字符串做模板参数

时间:2023-01-07 16:27:53
#include <iostream>

using namespace std;

template < char const * name>
class A
{};
extern char const *p = "str1";
extern char const q[] = "str2";

int main(int argc, char** argv)
{
    A<p> a1;
    A<q> a2;
    return 0;
}



为什么p作为模版参数不行?它和q的区别是什么呢? 谢谢!!!

7 个解决方案

#1


因为q[]是数组,所以q的地址是一个常量。
而p尽管是一个const指针,但本质上仍然是一个变量。

#2


mark

#3


模板是以类型做参数
你的p是类型么?

#4


非类型模板实参通常可以是常整数或指向 外部链接对象的指针
"str1"是一个具有内部链接的对象,也就是在不同的模块中是两个完全不同的对象
指向"str1"的p显然不满足非类型模板实参的要求
而字符数组q则是拷贝了"str2"的一个副本,所以指针q是一个指向外部链接对象的指针,满足要求

#5


为什么说str1是个具有内部连接的对象呢?
char const * p 和char const q[] 在编译时编译器是如何对待他们的, 如何给他们分配内存,谢谢!!?

#6



内存中间有专门的常量存储区了啊
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,
不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

    A<p> a1;
    A<q> a2;
对于类模板来说参数只能是类型啊,函数模板参数可以是实参的,因为对于函数模板可以根据实参演绎

#7


楼主啊,如果你真想对模板刨根问底,还是去看《C++ Templates》吧。
里面解答了为什么字符串常量不可以成为模板参数的原因。及其它更多模板上的学问。

#1


因为q[]是数组,所以q的地址是一个常量。
而p尽管是一个const指针,但本质上仍然是一个变量。

#2


mark

#3


模板是以类型做参数
你的p是类型么?

#4


非类型模板实参通常可以是常整数或指向 外部链接对象的指针
"str1"是一个具有内部链接的对象,也就是在不同的模块中是两个完全不同的对象
指向"str1"的p显然不满足非类型模板实参的要求
而字符数组q则是拷贝了"str2"的一个副本,所以指针q是一个指向外部链接对象的指针,满足要求

#5


为什么说str1是个具有内部连接的对象呢?
char const * p 和char const q[] 在编译时编译器是如何对待他们的, 如何给他们分配内存,谢谢!!?

#6



内存中间有专门的常量存储区了啊
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,
不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

    A<p> a1;
    A<q> a2;
对于类模板来说参数只能是类型啊,函数模板参数可以是实参的,因为对于函数模板可以根据实参演绎

#7


楼主啊,如果你真想对模板刨根问底,还是去看《C++ Templates》吧。
里面解答了为什么字符串常量不可以成为模板参数的原因。及其它更多模板上的学问。