2013-08-13 16 views
7

Tôi có hai dòng sau đây trong một tiêu đề để khai báo một vector chứa mẫu:thành viên dữ liệu 'vec' không thể là một mẫu thành viên

template <class t> 
    std::vector <t> vec; 

Tuy nhiên tôi nhận được lỗi sau: thành viên dữ liệu ' vec 'không thể là mẫu thành viên Tôi đã làm gì sai? Edit: Tôi không biết rằng tôi đã hiểu một cách chính xác, tôi đang cố gắng để khai báo một vector chứa một mẫu, tôi biết rằng điều này có thể được thực hiện như một người có thể có những điều sau đây:

template <class T> 
void funct(vector <T> v){ 


} 

chức năng này lấy một véc tơ của một mẫu làm tham số của nó, tôi muốn làm điều tương tự ngoại trừ việc khai báo vectơ trong một tiêu đề để cho phép vectơ chứa bất cứ thứ gì.

+0

bạn đang cố gắng làm gì đây? 'std :: vector' cần tham số mẫu và bạn không cung cấp thông số mẫu. – Mahesh

+0

lỗi của tôi được đăng không chính xác – user2673108

+0

Nó hoạt động [tốt] (http://coliru.stacked-crooked.com/view?id=fa534fe247eb921117923287a1046596-f674c1a6d04c632b71a62362c0ccfc51). – Mahesh

Trả lời

0

Vector luôn cần một lớp T làm mẫu. Nhưng bản mẫu nên được đặt trước tuyên bố lớp học.

Bạn có thể có nghĩa là

template<class T> 
class A { 
private: 
std::vector<T> vec; 
}; 
2

Tuyên bố template <> chỉ được sử dụng khi tuyên bố một hàm mẫu hoặc một lớp mẫu. Ví dụ, bạn có thể sử dụng nó khi bạn khai báo (và xác định) một lớp:

template <typename T> 
class TemplateClass { 
    /* definition */ 
}; 

Hoặc một hàm:

template <typename T> 
void templateFunc(T value) { 
    /* definition */ 
} 

Khi tạo một dụ của lớp, bạn không thể sử dụng template <> tuyên bố. Thay vào đó bạn chỉ định một mẫu tham số như thế này:

TemplateClass<int> tc; 

Và khi gọi một mẫu chức năng:

int i = 1; 
templateFunc(i); // <-- Automatic template deduction to int. 
2

vector như vậy không thể chứa bất cứ điều gì. Giả sử rằng một trình biên dịch cho phép bạn khai báo một vector như vậy, và bạn viết mã như

//... 
    A Aobj; 
    vec.push_back(Aobj); 
//... 

Sau đó, kích thước của một phần tử trong vec sẽ là sizeof(A). Nhưng tiếp theo bạn viết

//... 
    B Bobj; 
    vec.push_back(Bobj); 
//... 

Kích thước của một phần tử ở đây phải là gì?

Dù sao, như cách giải quyết bạn có thể khai báo vector<void*> vec điều này sẽ chứa một gợi ý cho bất kỳ điều gì bạn muốn.

+0

Có, nhưng 'void *' sẽ khiến anh ta mất tất cả thông tin kiểu. Cách tốt nhất là sử dụng 'Biến thể' (từ ** tăng **, hoặc tự thực hiện). –

+0

@MaximeOudot Tôi đồng ý. C++ 11 hoặc 14 thậm chí còn hỗ trợ 'union' cho các' lớp 'tùy chỉnh, không cần sử dụng các libs khác. –

1

Không có thứ gì như thành viên dữ liệu được tạo khuôn mẫu. Các loại mẫu duy nhất là mẫu lớpmẫu chức năng. Ví dụ khác của bạn là một mẫu chức năng.

Hãy thử và suy nghĩ về cách một người nào đó sẽ khởi tạo lớp học của bạn.Giả sử đó là pháp lý để làm:

struct S 
{ 
    template<typename T> 
    T x; 
}; 

int main() 
{ 
    S s; 
    s.x = ???? 
} 

Loại S phải được biết để làm S s;, nó không thể kỳ diệu thay đổi để phù hợp với bất cứ loại bạn quyết định để cung cấp cho x. Trong thực tế, bạn thậm chí không thể đánh giá s.x.

Để giải quyết vấn đề của bạn, bạn cần phải thực hiện các tham số mẫu là một tham số mẫu của lớp có chứa các thành viên dữ liệu, ví dụ .:

template<typename T> 
struct S 
{ 
    vector<T> vec; 
}; 

int main() 
{ 
    S<int> s; 
    s.vec = vector<int>(5); 
}