cuốn sách gpt4 ai đã làm

c++ - Foo f = Foo();//Không có hàm khớp nào được gọi là 'Foo::Foo(Foo)'...huh?

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 14:53:48 27 4
mua khóa gpt4 Nike

lớp học
{
public:
rõ ràng Foo() {}
rõ ràng Foo(Foo&) {}
};

Foo d = Foo();

lỗi: không có chức năng khớp cho lệnh gọi tới 'Foo::Foo(Foo)'

Tôi đã thử làm theo thông báo lỗi để thay đổi Foo(Foo&) Thay đổi thành Foo(Foo), mà AFAIK không phải là hàm tạo hợp lệ và tôi chắc chắn nhận được:

lỗi: hàm tạo không hợp lệ; có thể ý bạn là 'Foo (const Foo&)'

Cái gì đã cho? Làm thế nào tôi có thể giải quyết vấn đề này? (BTW, đây là trên GCC)

câu trả lời hay nhất

Có hai điều khó hiểu trong hàm tạo bản sao của bạn.

Trước tiên, bạn đã làm cho hàm tạo bản sao trở nên rõ ràng (đây là một vấn đề), vì vậy (về mặt lý thuyết) bạn cần phải làm điều này:

Foo d( (Foo()) );

Thứ hai, hàm tạo bản sao của bạn lấy một tham chiếu thay vì const tài liệu tham khảo, có nghĩa là bạn không thể sử dụng nó tạm thời Foo được sử dụng cùng nhau.

Cá nhân tôi chỉ xóa khỏi hàm tạo bản sao rõ ràng và sử dụng bất cứ khi nào có thể const 引用。

Lưu ý rằng trên hàm tạo mặc định rõ ràng không hợp lệ. [*] rõ ràng Chỉ ảnh hưởng đến các hàm tạo có thể được gọi bằng một đối số duy nhất. Nó ngăn không cho chúng được sử dụng cho các chuyển đổi ngầm. Nó không có tác dụng đối với các hàm tạo chỉ chấp nhận 0 hoặc hai hoặc nhiều đối số.

[Lưu ý: Có thể có sự khác biệt giữa hai điều này:

Đồ ăn;

Foo d = Foo();

Nhưng trong trường hợp này, bạn có hàm tạo mặc định do người dùng khai báo, vì vậy điều này không áp dụng. ]

biên tập:[*] Tôi vừa kiểm tra lại cái này và 12.3.1 [class.conv.ctor] nói rằng bạn có thể tạo một hàm tạo mặc định rõ ràng. Trong trường hợp này, hàm tạo sẽ được sử dụng để thực thiKhởi tạo mặc định hoặcKhởi tạo giá trị. Thành thật mà nói, tôi không hiểu giá trị của nó, giống như nếu bạn có một hàm tạo do người dùng khai báo thì đó là loại không phải POD, ngay cả các đối tượng cục bộ thuộc loại không phải POD sẽ được khởi tạo theo mặc định nếu không có trình khởi tạo trong mệnh đề này chỉ ra rằng nó có thể vượt qua rõ ràng Hàm tạo mặc định hoàn tất. Có lẽ ai đó có thể chỉ ra một trường hợp đặc biệt trong đó nó tạo ra sự khác biệt, nhưng hiện tại tôi chưa thấy điều đó rõ ràng Nó có tác dụng gì đối với hàm tạo mặc định.

Giới thiệu về c++ - Foo f = Foo();//Không có hàm khớp nào được gọi là 'Foo::Foo(Foo)'...huh? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/2776313/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress