c++ 构造函数 which is of non-class type奇葩问题
一个奇怪的问题,明明模仿书上代码小试一下,结果出现一个
error: request for member 'push' in 's', which is of non-class type 'T_stack<int>()'|
先上实现代码,先不要在意我为什么不直接用std::stack,而是自定义的stack里套一个std::vector。这里是想试一下模板类。然后就出问题了。
template <typename T> class T_stack{public:typedef typename std::vector<T>::size_type size_type;T_stack<T>():data(std::make_shared<std::vector<T>>()){};//T_stack<T>(std::initializer_list<T>);bool empty(){return data->empty();}void push( T &t){data->push_back(t);}void push(const T &&t){data->push_back(t);}//void pop();T &top();
private:std::shared_ptr<std::vector<T>> data;
};
template <typename T>
void T_stack<T>::pop(){data->pop_back();
}
template <typename T>
T &T_stack<T>::top(){return data->back();
}
/*template <typename T>
T_stack::T_stack<T>(std::initializer_list<T> il){}*/
int main()
{T_stack<int> s();s.push(5);std::cout << s.top();
}
编译器报错,报错代码在push函数就以为是push函数的问题。其实是发生在构造函数上的。比较奇怪。
是因为我在main函数中使用了T_stack<int> s()
导致的。
因为不带参数的构造函数,比如T_stack<T>()
它可以是一个对象,也可是一个函数声明。但是c++编译器总是优先认为是一个函数声明,然后是对象。
我找了下有几种方法可以避免这种模糊性的。
1. 不使用()初始化对象,比如T_stack<int> s
2. 使用花括号{}初始化对象,比如T_stack<int> s{};
3. 使用赋值运算符和匿名默认构造的对象:T_stack<int> s = T_stack<int> {}
。
c++ 构造函数 which is of non-class type奇葩问题相关推荐
- 《深入理解C++11:C++ 11新特性解析与应用》——3.2 委派构造函数
3.2 委派构造函数 类别:类作者 与继承构造函数类似的,委派构造函数也是C++11中对C++的构造函数的一项改进,其目的也是为了减少程序员书写构造函数的时间.通过委派其他构造函数,多构造函数的类编写 ...
- C++中的转换构造函数和类型转换函数
文章目录 1 C++中的转换构造函数 1.1 转换构造函数 1.2 explicit关键字 2 C++中的类型转换函数 2.1 类型转换函数 3 转换构造函数与类型转换函数之间的冲突 3.1 转换构造 ...
- typescript (TS)进阶篇 --- 内置高阶泛型工具类型(Utility Type)
第一部分 前置内容 关键字 keyof 索引查询 对应任何类型T,keyof T的结果为该类型上所有公有属性key的联合: interface Eg1 {name: string,readonly a ...
- python 类构造函数_Python构造函数创建类对象
python 类构造函数 In the last tutorial, we learned how to create a class, its instance and how to access ...
- js中构造函数的创建
构造函数的创建 方法一 <script type="text/javascript">//1函 2 实 3 属 4 方 5 调function Play(){}//实例 ...
- QWidget一生,从创建到销毁事件流
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QWidget一生,从创建到销毁事件流 本文地址:http://techieliang ...
- opencv mat用数组初始化_10、OpenCV中图像和Mat类型(一)
Mat类型可以被认为是OpenCV库的核心. OpenCV库中绝大多数的函数都是Mat类的成员,以Mat作为参数,或者Mat作为返回值. Mat类用于表示任意维数的密集数组.即使对于数组中的该条目为零 ...
- 菜菜从零学习WCF十(序列化)
前言 本次课程的主要内容包括以下四格部分:DataContractSerializer.序列化.反序列化.XmlSerializer 第一部分--DataContractSerializer Wind ...
- c# 4.0(vs2010)新特性一览
终于静下心来仔细听了一遍Anders Hejlsberg(Visual Studio组的TECHNICAL FELLOW,C#的设计者之一)在PDC08上讲的"The Future of C ...
最新文章
- while (true) 和 for (;;) 到底哪个更快?
- C语言基础-第一个C程序
- Windows校验文件哈希hash的两种常用方式
- Bugku杂项(一)
- Fedora 18 下安装 mplayer
- 使用JMeter创建数据库(Mysql)测试
- 移植ubuntu14.04根文件系统至beaglebone开发板探索
- Web前端开发初学者十问集锦(4)
- 游戏开发之深拷贝与浅拷贝(C++基础)
- 数据文件检验坏块的利器-dbv
- VS2015设置网站/WebSite的启动端口
- 软件配置管理(一)配置管理概念与目标
- 复习DOS及批处理命令
- Lake Shore—CRX-EM-HF 型低温探针台
- 从给定网页上下载img src= /格式的图片,并保存到制指定路径
- asp.net学生档案管理系统
- 分类模型计算混淆矩阵
- 暑假N天乐 —— 多重+分组背包及变形
- html三角形下拉列表,CSS—纯CSS实现三角图形(常用于带指引效果的小三角,下拉列表的小三角等)...
- 高级编程技术hw week 13