// test3.cpp
#include <stack>
using namespace std;
template<typename T>
struct ptr_stack_tp;
template<typename T>
struct ptr_stack_tp<T*> : public stack<T*>
{
~ptr_stack_tp()
{
while (!empty()) {
operator delete(top());
pop();
}
}
};
int main()
{}
Thông báo lỗi (gcc 4.7.2):
test3.cpp: In destructor 'ptr_stack_tp<T*>::~ptr_stack_tp()':
test3.cpp:15:23: error: there are no arguments to 'empty' that depend on a template parameter, so a declaration of 'empty' must be available [-fpermissive]
test3.cpp:15:23: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
test3.cpp:16:33: error: there are no arguments to 'top' that depend on a template parameter, so a declaration of 'top' must be available [-fpermissive]
test3.cpp:17:17: error: there are no arguments to 'pop' that depend on a template parameter, so a declaration of 'pop' must be available [-fpermissive]
Chức năng empty()
, top()
và pop()
là các chức năng của std::stack
, vậy tại sao gcc không tìm thấy chúng?
Đó là tên phụ thuộc, 'this-> empty() 'vv – Xeo
Mã này có rủi ro cao. Nếu bạn truyền xung quanh một 'ptr_stack_tp' như một con trỏ tới' stack 'và gọi' delete' trên đó bạn sẽ nhận được một lỗ hổng bộ nhớ rất lớn (có thể) rất khó tìm. Không lấy được từ các lớp thư viện chuẩn, thay vào đó thực hiện hành vi của chúng theo thành phần. –
filmor