2009-11-25 39 views
9

Tôi chắc chắn rằng điều đó là có thể nhưng tôi không thể làm điều đó, đó là: Làm cách nào để xác định mẫu chức năng bên trong lớp không phải mẫu? Tôi đã thử một cái gì đó như thế này:Mẫu chức năng trong lớp không phải mẫu

class Stack_T 
{ 
    private: 
     void* _my_area; 
     static const int _num_of_objects = 10; 

    public: 
     // Allocates space for objects added to stack 
     explicit Stack_T(size_t); 
     virtual ~Stack_T(void); 

     // Puts object onto stack 
     template<class T> 
     void put(const T&); 

     // Gets last added object to the stack 
     template<class T> 
     T& get()const; 

     // Removes last added object from the stack 
     template<class T> 
     void remove(const T&); 
}; 

template<class T> //SOMETHING WRONG WITH THIS DEFINITION 
void Stack_T::put<T>(const T& obj) 
{ 
} 

nhưng nó không hoạt động. Tôi nhận được err này msg:

'Lỗi 1 lỗi C2768: 'Stack_T :: đặt': sử dụng trái phép mẫu lập luận rõ ràng'
Cảm ơn bạn

Trả lời

9

Đừng đặt <T> sau tên hàm . Điều này sẽ làm việc:

template<class T> 
void Stack_T::put(const T& obj) 
{ 
} 

Sửa:

này vẫn sẽ không hoạt động nếu định nghĩa hàm không có trong file header. Để giải quyết vấn đề này, hãy sử dụng một trong số:

  • Đặt định nghĩa hàm trong tệp tiêu đề, bên trong lớp học.
  • Đặt định nghĩa hàm trong tệp tiêu đề sau lớp (như trong mã ví dụ của bạn).
  • Sử dụng instanciation mẫu rõ ràng trong tệp tiêu đề. Điều này có những hạn chế nghiêm trọng mặc dù (bạn phải biết tất cả các giá trị có thể có của T trước).
+0

tôi tryied này nhưng tôi nhận được một lỗi: 'Lỗi LNK2019 lỗi: chưa được giải quyết biểu tượng bên ngoài "public: void __thiscall Stack_T :: đưa (int const &)" (?? $ đặt @ H @ Stack_T @@ QAEXABH @ Z) được tham chiếu trong hàm _wmain \t Stack_of_Objects.obj ' –

0

Ứng dụng cho mọi người cố gắng giúp tôi với câu hỏi đó. Sai lầm chính của tôi mà tôi đưa vào tệp .h chính là với lớp bê tông và tôi quên rằng với các mẫu câu chuyện có chút khác biệt và để làm điều đó, người ta phải sử dụng mô hình bao gồm hoặc tách, mà tôi đã quên. Một lần nữa cảm ơn bạn và tôi xin lỗi vì đã làm phiền.

Các vấn đề liên quan