2011-11-12 34 views
16

Tôi có một lớp mà tôi cố khởi tạo nhưng gặp lỗi "Không có hàm tạo phù hợp để khởi tạo 'TextureCoordinates'";C++ "Không có hàm tạo nào phù hợp để khởi tạo" lỗi trình biên dịch

lớp mà tôi đang cố gắng để khởi tạo:

class TextureCoordinates 
{ 
public: 
    TextureCoordinates(){}; 
    TextureCoordinates(Point2D& origin, Dimensions2D& dim); 
    Point2D getOrigin() const {return origin;}; 
    Dimensions2D getDim() const {return dim;}; 
private: 
    Point2D origin; 
    Dimensions2D dim; 
}; 

Line với trình biên dịch báo lỗi:

TextureCoordinates result(point, Dimensions2D(width, height)); 

Định nghĩa của constructor:

TextureCoordinates::TextureCoordinates(Point2D& origin, Dimensions2D& dim): 
origin(origin), dim(dim) {} 

Bất kỳ ý tưởng những gì tôi đang làm sai rồi?

+0

Định nghĩa của hàm tạo ở đâu? Tất cả những gì tôi thấy là tuyên bố. – Pubby

+0

Tôi vừa thêm nó. – Xavier

Trả lời

16

Phương thức khởi tạo của bạn lấy đối số bằng tham chiếu không phải const, nhưng bạn chuyển đối tượng tạm thời (Dimensions2D(width, height)) đến nó. Temporaries, thậm chí không phải const, không liên kết với tham chiếu không const.

Giải pháp, làm cho constructor của bạn lấy tài liệu tham khảo const (nó không nên thay đổi các đối tượng thông qua anyway):

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim); 
4
TextureCoordinates result(point, Dimensions2D(width, height)) 

Tham số thứ hai là một rvalue mà không thể bị ràng buộc để vế trái tham khảo các nhà xây dựng hy vọng :

TextureCoordinates(Point2D& origin, Dimensions2D& dim); 

Bạn có thể sửa chữa nó bằng cách thay đổi chữ ký của các nhà xây dựng để

TextureCoordinates(Point2D& origin, const Dimensions2D& dim); 
TextureCoordinates(Point2D& origin, Dimensions2D&& dim); // alternative for c++11 

(nếu bạn có thể) hoặc làm cho các tham số một biến

Dimension2D dim=Dimensions2D(width, height); 
TextureCoordinates result(point, dim) 
-1

bạn đã viết thi hành:

TextureCoordinates(Point2D& origin, Dimensions2D& dim); 
0

Khai Dimensions2d bên ngoài.

Dimension2d d(width, height); 
TextureCoordinates result(point, d); 
0

Biến tạm thời không thể chuyển thành tham chiếu trong C++ vì bạn có thể thay đổi giá trị của đối tượng tạm thời trong hàm sắp biến mất !! Không có vấn đề như vậy tồn tại để tham chiếu đến các hằng số ..... Vì vậy, định nghĩa chức năng của bạn phải giống như

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim); 
Các vấn đề liên quan