首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

4.3  非类型模板参数的限制

我们还应该知道:非类型模板参数是有限制的。通常而言,它们可以是常整数(包括枚举值)或者指向外部链接对象的指针。

浮点数和类对象(class-type)[14]是不允许作为非类型模板参数的:

template<double VAT>        //ERROR:浮点数不能作为非类型模板参数

double process (double v)  

{

    return v * VAT;

}

template<std::string name>  //ERROR:类对象不能作为非类型模板参数

class MyClass {

...

};

之所以不能使用浮点数(包括简单的常量浮点表达式)作为模板实参是有历史原因的。然而,该特性的实现并不存在很大的技术障碍;因此,将来的C++版本可能会支持这个特性。

由于字符串文字是内部链接对象(因为两个具有相同名称但处于不同模块的字符串,是两个完全不同的对象),所以你不能使用它们来作为模板实参:

template<char const* name>

class MyClass {

...

};

   

MyClass<”hello”> x;     //ERROR:不允许使用字符串文字”hello”

另外,你也不能使用全局指针作为模板参数:

template <char const* name>

class MyClass {

...

};

char const* s = ”hello”;

MyClass<s> x;           //s是一个指向内部链接对象的指针

然而,你可以这样使用:

template <char const* name>

class MyClass {

...

};

extern char const s[] = ”hello”;

MyClass<s> x;       //OK

全局字符数组s由“hello”初始化,是一个外部链接对象。

详细的讨论,请见8.3.3小节;而13.4节给出了将来在这方面可能出现的改变。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论