Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >c++模板:调用模板成员函数需不需要加template关键字?

c++模板:调用模板成员函数需不需要加template关键字?

作者头像
10km
发布于 2022-04-13 04:37:03
发布于 2022-04-13 04:37:03
1.1K00
代码可运行
举报
文章被收录于专栏:10km的专栏10km的专栏
运行总次数:0
代码可运行

以下是个简单的模板类测试代码,模板类A中定义了模板函数hello,在模板函数test中调用A::hello template_test.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T>
struct A{
	template<class I>
	void hello(){}
	template<class I>
	void hello2(I i){}
};
template <class T>
void test(A<T> & a)
{
	a.hello<int>();
	a.hello2(100);
}

int main()
{
	A<int> a;
	test(a);
}

Visual Studio 2015下可以正常编译通过,但在gcc 5.2.0下就不行,报错如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ g++ template_test.cpp
template_test.cpp: In function 'void test(A<T>&)':
template_test.cpp:11:10: error: expected primary-expression before 'int'
  a.hello<int>();
          ^
template_test.cpp:11:10: error: expected ';' before 'int'

解决这个问题的办法很简单修改A::hello函数的调用方式,增加template关键字申明hello为模板函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T>
void test(A<T> & a)
{
	a.template hello<int>();
}

为什么会这样? 添加 template 关键字的目的是消除语法歧义,告诉编译器hello是个模板成员。否则编译器会将后面的<视为比较运算符。

同样是模板成员函数,hello2因为调用时不需要指定显式模板参数,不加template关键字也可以被编译正确识别。

如下是C++标准中的说明(《14.2 Names of template specializations》):

当类的模板成员名称出现在 .-> 在后缀表达式中,或在限定标识符中的嵌套名称说明符之后,并且后缀表达式或限定标识符显式依赖于模板参数(14.6.2),成员模板名称必须是以template关键字为前缀。否则,该名称被假定为非模板名。

以下是从C++标准文档(《Working Draft, Standard for Programming Language C++》 )摘录的14.2原文

那么为什么MSVC就不需要tempate关键字也能正常编译呢?我只能说在这个部分微软编译器更聪明些。

参考资料

《When do we need a .template construct》 《Confusing Template error (3)》

《模板和大于/小于符号的歧义》

《Working Draft, Standard for Programming Language C++》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++模板总结
模板(Template)指 C++ 程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如 STL 以及 IO Stream。模板是 C++ 支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
C语言与CPP编程
2021/12/10
1.3K0
C++模板总结
C++模板(关键字template,typename)介绍
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
Twcat_tree
2022/11/29
1.2K0
C++函数模板(模板函数)详解
大家好,又见面了,我是你们的朋友全栈君。 C++函数模板(模板函数)详解 定义 用法: 函数模板的原理 延申用法 2.1为什么需要类模板 2.2单个类模板语法 2.3继承中的类模板语法 案例1: 案例2: 2.4类模板的基础语法 2.5类模板语法知识体系梳理 1.所有的类模板函数写在类的内部 复数类: 2.所有的类模板函数写在类的外部,在一个cpp中 2.5总结 关于类模板的几点说明: 2.6类模板中的static关键字 案例2:以下来自:C++类模板遇上static关键字 2.7类模板在项目开发中的
全栈程序员站长
2022/07/22
1.9K0
C++函数模板(模板函数)详解
从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
s1mba
2017/12/28
1.4K0
C++函数模板与类模板
那么,如果你想交换两个其他类型的就需要写一个重载函数,这样是非常麻烦的。 这时C++就有了模板。
有礼貌的灰绅士
2023/03/28
8180
C++函数模板与类模板
C++ 模板开发
template是关键字,<class type>表示指定的类型(类似java的泛型),ret-type表示返回类型 func-name(parameter list):函数名称和参数
包子388321
2020/06/16
9030
那些陌生的C++关键字
那些陌生的C++关键字 学过程序语言的人相信对关键字并不陌生。偶然间翻起了《C++ Primer》这本书,书中列举了所有C++的关键字。我认真核对了一下,竟然发现有若干个从未使用过的关键字。一时间对一
Florian
2018/02/05
9730
那些陌生的C++关键字
【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )
在博客 【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 ) 中实现了第一种情况 , 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码 ;
韩曙亮
2023/11/23
2750
【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )
C++ 模板学习
1. 模板的概念。 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数
猿人谷
2018/01/17
9720
C++ 模板学习
C++函数模板与分离编译模式
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程称为分离编译模式。
恋喵大鲤鱼
2019/02/22
3K1
【Example】C++ Template (模板)概念讲解及编译避坑
C++ 不同于 Java,它没有标准的 Object 类型。也就意味着 C++ 并不存在完整的泛型编程概念。
芯片烤电池
2022/04/27
8270
【C++】模板初阶
以实现交换函数为例,在C语言中即使是近乎完全一致的的功能,通过代码实现,只要参数不同,我们就需要写对应类型的不同函数名的函数,在之前的学习中,我们已经学习了函数重载,我们不再需要起不同的函数名,比起C语言方便不少,但是不容忽视的是函数重载仍然有不好的地方。
ZLRRLZ
2024/12/13
770
【C++】模板初阶
【C++ 函数模板】—— 模板参数推导、实例化策略与编译优化
上篇文章我们讲到C++的函数重载,包括函数重载的条件,原理以及一些易错事项,那么本文我们为大家介绍C++中泛型编程的主要方式——模板。
换一颗红豆
2025/03/14
790
【C++ 函数模板】—— 模板参数推导、实例化策略与编译优化
C++复习笔记——C++ 关键字
new new(新建)用于新建一个对象。new运算符总是返回一个指针。由 new 创建
莫斯
2020/09/10
1.3K0
【C++学习】模板初阶&&STL简介
使用函数重载虽然可以实现,但是有一下几个不好的地方: 💞 1、重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。 💞 2、代码的可维护性比较低,一个出错可能所有的重载均出错。
IsLand1314
2024/10/15
1000
【C++学习】模板初阶&&STL简介
【c++】模板编程解密:C++中的特化、实例化和分离编译
非类型模板参数允许你将一个值(而不是一个类型)直接传递给一个模板。非类型模板参数可以是一个整型值、一个指针或者一个引用,因为这些参数不是类型,所以被称为“非类型模板参数”。
用户11029103
2024/05/04
6420
【c++】模板编程解密:C++中的特化、实例化和分离编译
C++函数模板详解
经常有碰到函数模块的应用,很多书上也只是略有小讲一下,今天又狂碰到函数模块,无奈特地找来C++编程经典<>翻阅一遍,终于有所全面了解..... C++函数模块基础: 一. 问题: 强类型语言要求我们为
程序员互动联盟
2018/03/16
1K0
C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记
本节内容主要讲述 c++11 模板的用法,以后的代码中会大量的用到模板的知识。同时简单讲解迭代器的相关知识,为后面容器和算法的内容作铺垫。
韩旭051
2019/11/07
6140
C++之模板(上)
本文介绍了C++模板的基础概念,简单介绍了泛型编程,模板,以及模板中的函数模板与类模板等相关概念。
摘星
2023/04/28
4140
C++之模板(上)
【C++】C++模板基础知识篇
所以c++就提供了模板,就相当于一个模具,让编译器根据不同的类型利用该模子来生成代码。
zxctscl
2024/03/09
1130
【C++】C++模板基础知识篇
相关推荐
C++模板总结
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验