2012-07-09 42 views
7

Tôi không chắc chắn chính xác cần bao nhiêu thông tin để trả lời câu hỏi này, vì vậy hãy cho tôi biết nếu cần thêm thông tin.Lớp C++ không phải là cơ sở của chính nó

Im sửa đổi mã lớn tôi đã viết khi tôi đột nhiên gặp phải thông báo này: error: type 'integer' is not a direct base of 'integer'. tôi biết một vấn đề thừa kế của nó, nhưng im không kế thừa các lớp khác.

Mã đó gây ra vấn đề này là

integer(const std::string & val, uint16_t base): integer(val.begin(), val.end(), base) {} 

integer(iterator start, iterator end, uint16_t base) 

đã được xác định.

Tôi cần phải làm gì để khắc phục sự cố này?

EDIT: im biên soạn với -std = C++ 0x, mà theo các câu trả lời, tôi sẽ có thể biên dịch, trừ khi trình biên dịch của tôi là cũ: gcc 4.6.2 tôi nghĩ rằng

+2

Cập nhật câu trả lời, có sẵn trong gcc 4.7 trở đi. – hmjd

Trả lời

19

Dường như bạn đang cố gắng gọi constructor khác trực tiếp. Bạn không thể làm điều đó trong C++ 03, nhưng bạn can do exactly that in C++11:

class SomeType { 
    int number; 

public: 
    SomeType(int new_number) : number(new_number) {} 
    SomeType() : SomeType(42) {} 
}; 

Bạn sẽ cần g ++ 4.7 hoặc mới hơn để làm việc này, 4.6 không hỗ trợ tính năng này, thậm chí với -std = C++ 0x, mà tôi đã thử nghiệm với cả hai phiên bản trên hệ thống của mình.

+0

im biên dịch với -std = C++ 0x – calccrypto

+3

@calccrypto GCC 4.6 không hỗ trợ điều này. 4.7 tôi nghĩ vậy. – Flexo

3

Bạn có thể không gọi một hàm tạo của cùng một lớp trong danh sách khởi tạo của một hàm tạo khác (trong C++ 03). Nhưng bạn có thể khởi tạo các thành viên phù hợp:

integer(const std::string & val, uint16_t base): _start(val.begin()) 
               _end(val.end()) 
               _base(base) 
{} 
4

Không được phép để gọi constructor khác của cùng một class như thế (có ủy thác xây dựng trong C++ 11). Bạn cần khởi tạo các thành viên của lớp (như bạn có thể đã làm trong hàm dựng khác).

EDIT:

Theo C++0x/C++11 Support in GCC , nhà thầu ủy thác được thực hiện trong GCC v4.7

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