一个奇怪的问题,明明模仿书上代码小试一下,结果出现一个

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奇葩问题相关推荐

  1. 《深入理解C++11:C++ 11新特性解析与应用》——3.2 委派构造函数

    3.2 委派构造函数 类别:类作者 与继承构造函数类似的,委派构造函数也是C++11中对C++的构造函数的一项改进,其目的也是为了减少程序员书写构造函数的时间.通过委派其他构造函数,多构造函数的类编写 ...

  2. C++中的转换构造函数和类型转换函数

    文章目录 1 C++中的转换构造函数 1.1 转换构造函数 1.2 explicit关键字 2 C++中的类型转换函数 2.1 类型转换函数 3 转换构造函数与类型转换函数之间的冲突 3.1 转换构造 ...

  3. typescript (TS)进阶篇 --- 内置高阶泛型工具类型(Utility Type)

    第一部分 前置内容 关键字 keyof 索引查询 对应任何类型T,keyof T的结果为该类型上所有公有属性key的联合: interface Eg1 {name: string,readonly a ...

  4. python 类构造函数_Python构造函数创建类对象

    python 类构造函数 In the last tutorial, we learned how to create a class, its instance and how to access ...

  5. js中构造函数的创建

    构造函数的创建 方法一 <script type="text/javascript">//1函 2 实 3 属 4 方 5 调function Play(){}//实例 ...

  6. QWidget一生,从创建到销毁事件流

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QWidget一生,从创建到销毁事件流     本文地址:http://techieliang ...

  7. opencv mat用数组初始化_10、OpenCV中图像和Mat类型(一)

    Mat类型可以被认为是OpenCV库的核心. OpenCV库中绝大多数的函数都是Mat类的成员,以Mat作为参数,或者Mat作为返回值. Mat类用于表示任意维数的密集数组.即使对于数组中的该条目为零 ...

  8. 菜菜从零学习WCF十(序列化)

    前言 本次课程的主要内容包括以下四格部分:DataContractSerializer.序列化.反序列化.XmlSerializer 第一部分--DataContractSerializer Wind ...

  9. c# 4.0(vs2010)新特性一览

    终于静下心来仔细听了一遍Anders Hejlsberg(Visual Studio组的TECHNICAL FELLOW,C#的设计者之一)在PDC08上讲的"The Future of C ...

最新文章

  1. while (true) 和 for (;;) 到底哪个更快?
  2. C语言基础-第一个C程序
  3. Windows校验文件哈希hash的两种常用方式
  4. Bugku杂项(一)
  5. Fedora 18 下安装 mplayer
  6. 使用JMeter创建数据库(Mysql)测试
  7. 移植ubuntu14.04根文件系统至beaglebone开发板探索
  8. Web前端开发初学者十问集锦(4)
  9. 游戏开发之深拷贝与浅拷贝(C++基础)
  10. 数据文件检验坏块的利器-dbv
  11. VS2015设置网站/WebSite的启动端口
  12. 软件配置管理(一)配置管理概念与目标
  13. 复习DOS及批处理命令
  14. Lake Shore—CRX-EM-HF 型低温探针台
  15. 从给定网页上下载img src= /格式的图片,并保存到制指定路径
  16. asp.net学生档案管理系统
  17. 分类模型计算混淆矩阵
  18. 暑假N天乐 —— 多重+分组背包及变形
  19. html三角形下拉列表,CSS—纯CSS实现三角图形(常用于带指引效果的小三角,下拉列表的小三角等)...
  20. 高级编程技术hw week 13

热门文章

  1. [体渲染]渲染一个球体
  2. 【教程】批量删除B站抽奖动态
  3. 5.3 添加移除黑名单号码
  4. 慧荣SM2246EN开卡Toggle 8贴东芝闪存SSD失败解决方法
  5. 词云中去重复的词_手把手教你挖掘蓝海词,打造爆款标题!
  6. 论文中world自带公式编辑器编辑的公式每次打开公式自动加粗问题解决。
  7. Elasticsearch如何提升查询效率
  8. 【Linux修炼】6.gcc/g++及Makefile【工具篇】
  9. AD10中创建材料清单(BOM表)
  10. 用html写除法竖式代码,除法的竖式写法