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> {}

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值