2012-02-08 36 views
11

Tôi khá mới đối với C++ và trang web này nên có ràng buộc là lỗi. Khi tôi cố gắng biên dịch mã của tôi, tôi nhận được lỗi như error: missing template argument before 'b'. Tôi đã tìm kiếm thế giới cho câu trả lời trong nhiều giờ và nó đã dẫn tôi đến đây."Đối số mẫu thiếu" nghĩa là gì?

Nhiệm vụ của tôi là triển khai Bộ sưu tập lớp theo khuôn mẫu lưu trữ bộ sưu tập gồm Đối tượng sử dụng mảng, dọc theo với kích thước hiện tại của bộ sưu tập.

#include <iostream> 
    #include "collection.h" 

    using namespace std; v 

    int main(int argc, char* argv[]) 
    { 
     collection b; //<----error missing template argument before 'b' 
     return 0; 
    } 

#ifndef COLLECTION_H 
    #define COLLECTION_H 

    #include <iostream> 

    template <typename obj> 
    class collection 
    { 
    public: 
     collection(); 
     bool isEmpty() const; 
     void makeEmpty(); 
     void insert(obj val); 
     void remove(obj val); 
     bool contains(obj val) const; 
    private: 
     size_t size; 
     obj* col[]; 
    }; 

    #endif 

#include "collection.h" 

    template <typename obj> 
    collection<obj>::collection() :size(10) 
    { 
     col = new obj*[size]; 
    } 

    template <typename obj> 
    bool collection<obj>::isEmpty() const 
    { 
     for(size_t k = 0; k < size; k++) 
     { 
      if(col[k] != NULL) 
       return false; 
     } 
     return true; 
    } 

    template <typename obj> 
    void collection<obj>::makeEmpty() 
    { 
     for(size_t k = 0; k < size; k++) 
     { 
      col[k] = NULL; 
     } 
    } 

    template <typename obj> 
    void collection<obj>::insert(obj val) 
    { 
     int temp = 0; 
     for(size_t s = 0; s < size; s++) 
     { 
      if(col[s] != NULL) 
       temp++; 
     } 
     if(temp >= size) 
     { 
      obj* temp = new obj*[size*2]; 

      for(size_t c = 0; c < size; c++) 
       temp[c] = col[c]; 

      delete col; 
      col = temp; 
     } 
     else 
      col[temp] = val; 
    } 

    template <typename obj> 
    void collection<obj>::remove(obj val) 
    { 
     for(size_t x = 0; x < size; x++) 
     { 
      if (col[x] == val) 
      { 
       for(size_t y = x; y < size-1; y++) 
       { 
        col[y] = col[y+1]; 
       } 
       col[size-1] = NULL; 
       return; 
      } 
     } 
    } 

    template <typename obj> 
    bool collection<obj>::contains(obj val) const 
    { 
     for(size_t z = 0; z < size; z++) 
     { 
      if(col[z] == val) 
       return true; 
     } 
     return false; 
    } 
+5

Chào mừng bạn đến với SO. Đây là một câu hỏi đầu tiên khá tốt, nhưng trong tương lai, hãy thử chỉ đăng một bộ mã tối thiểu mà vẫn trưng bày vấn đề. Trong trường hợp này, chúng ta không cần phải đọc toàn bộ nội dung của mẫu lớp 'collection' để tìm ra cái gì sai. Thông thường, tôi nghĩ rằng bạn sẽ thấy rằng việc thực hiện việc giảm thiểu mã trong câu hỏi của bạn sẽ dẫn bạn đến câu trả lời trước khi bạn đăng nó! :-) –

+2

Tom, Mat và Bojan là tất cả các quyền về câu hỏi ngay lập tức của bạn. Khi bạn đã sửa lỗi đó, bạn sẽ gặp vấn đề với tệp thứ ba đó: để khởi tạo đối tượng 'collection ' trong 'main', trình biên dịch sẽ cần xem hàm tạo. Nếu đó là trong một tập tin riêng biệt, nó sẽ không hoạt động. Thông thường bạn chỉ cần thoát khỏi triển khai trong phần đầu, nhưng nếu không, bạn có thể phải '# include' tệp thứ ba thay vì biên dịch nó bình thường. – Useless

Trả lời

1

Vâng, bạn đang bỏ lỡ một cuộc tranh luận mẫu. Bạn không thể tạo đối tượng collection, đó chỉ là mẫu.

Bạn chỉ có thể tạo ví dụ: a collection<int> hoặc collection<std::string>.

13

Bạn phải nói đó là bộ sưu tập.

template <class A> class collection {} 

đòi hỏi bạn phải sử dụng nó như

collection<int> b; 

hoặc một số loại thích hợp. Điều đó sau đó làm cho một bộ sưu tập của ints. Bạn đã không nói với nó những gì bạn muốn một bộ sưu tập.

+0

tôi muốn một bộ sưu tập các đối tượng. tôi đã cố gắng đưa vào những gì bạn nói và nó vẫn cho tôi lỗi "undefined reference to 'bộ sưu tập :: collection()'". tôi không cần truyền bất cứ thứ gì cho constructor. mọi loại dữ liệu mà tôi sử dụng thay cho vẫn mang lại cho tôi cùng một lỗi. – Josh

+0

xem nhận xét của @ Useless về câu hỏi –

1

Bạn cần phải xác định kiểu cho mẫu như int hoặc một số loại khác:

collection<int> b; 
0

Có một số lượng lớn các lỗi trong mã của bạn. Đầu tiên xác định mẫu của bạn trong một tập tin tiêu đề:

Trong collection.h đặt như sau:

#ifndef COLLECTION_H 
#define COLLECTION_H 

    template <typename obj> 
    class collection 
    { 
    public: 
     collection() {} 
     bool isEmpty() const; 
     void makeEmpty(); 
     void insert(obj val); 
     void remove(obj val); 
     bool contains(obj val) const; 
    private: 
     size_t size; 
     obj* col[]; 
    }; 

#endif 

Sau đó, trong một tập tin cpp bên trong một hàm chính thực hiện như sau:

collection<int> b; 

Thay vào đó của int bạn có thể sử dụng một loại khác nhau nhưng điểm chính là BẠN CẦN MỘT LOẠI để tạo mẫu.

5

Đầu tiên: Tạo mẫu theo loại. Vì vậy, nếu bạn có template <typename obj> class T {...}; bạn nên sử dụng nó như

void main { 
    T<int> t; 
    T<bool> t1; // .. etc 
} 

Bạn có thể sử dụng một mẫu với giá trị mặc định cho tham số typename định nghĩa trong lớp mẫu khai

template <typename obj = int> class T {/*...*/}; 

void main { 
    T<> t; 
} 

nhưng dù sao bạn nên đặt dấu ngoặc nhọn rỗng khi sử dụng nó mà không có tham số.

Thứ hai: Trong khi khai báo mẫu, hãy đặt toàn bộ mẫu trong tệp tiêu đề. Mỗi định nghĩa của các phương pháp của ông nên được trong tập tin "* .h", không hỏi tôi tại sao, chỉ cần không chia nó với tiêu đề và "cpp" tập tin.

Hy vọng điều đó sẽ hữu ích.

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