Có một tuyên bố của lớp mẫu với các thông số ngầm:Templates với các thông số ngầm, khai về phía trước, C++
List.h
template <typename Item, const bool attribute = true>
class List: public OList <item, attribute>
{
public:
List() : OList<Item, attribute>() {}
....
};
Tôi cố gắng để sử dụng tờ khai chuyển tiếp fllowing trong một tập tin tiêu đề khác nhau :
Analysis.h
template <typename T, const bool attribute = true>
class List;
Nhưng G ++ cho thấy lỗi này:
List.h:28: error: redefinition of default argument for `bool attribute'
Analysis.h:43: error: original definition appeared here
Nếu tôi sử dụng tờ khai phía trước không có tham số ngầm
template <typename T, const bool attribute>
class List;
trình biên dịch không chấp nhận xây dựng này
Analysis.h
void function (List <Object> *list)
{
}
và hiển thị lỗi sau (ví dụ: không chấp nhận những giá trị tiềm ẩn):
Analysis.h:55: error: wrong number of template arguments (1, should be 2)
Analysis.h:44: error: provided for `template<class T, bool destructable> struct List'
Analysis.h:55: error: ISO C++ forbids declaration of `list' with no type
câu hỏi Cập nhật:
tôi loại bỏ các thông số mặc định từ mẫu định nghĩa:
List.h
template <typename Item, const bool attribute>
class List: public OList <item, attribute>
{
public:
List() : OList<Item, attribute>() {}
....
};
Đầu tiên tệp bằng cách sử dụng danh sách lớp có khai báo chuyển tiếp với giá trị ngầm của thuộc tính tham số
Analysis1.h
template <typename T, const bool attribute = true>
class List; //OK
class Analysis1
{
void function(List <Object> *list); //OK
};
Lớp thứ hai sử dụng Danh sách lớp VỚI định nghĩa về phía trước bằng cách sử dụng giá trị tiềm ẩn
Analysis2.h
template <typename T, const bool attribute = true> // Redefinition of default argument for `bool attribute'
class List;
class Analysis2
{
void function(List <Object> *list); //OK
};
Lớp thứ hai sử dụng Danh sách lớp KHÔNG nét về phía trước sử dụng giá trị tiềm ẩn
Phân tích2.h
template <typename T, const bool attribute> // OK
class List;
class Analysis2
{
void function(List <Object> *list); //Wrong number of template arguments (1, should be 2)
};
Được rồi tôi hiểu vấn đề của bạn. Đó là bởi vì bạn thêm khai báo chuyển tiếp vào mỗi tệp nơi bạn * sử dụng * 'Danh sách'. DONT DO RATNG. Thay vào đó, hãy thêm khai báo chuyển tiếp vào trong 'List.h' trong đó bạn * định nghĩa *' List' ** và ** '#include" List.h "' trong mọi tệp nơi bạn sử dụng 'List'. Hãy cho tôi biết nếu bạn vẫn gặp vấn đề! – Nawaz
vì vậy câu hỏi của bạn sau khi cập nhật là gì? – UmmaGumma