一个奇怪的问题,明明模仿书上代码小试一下,结果出现一个
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> {}
。