2011-07-10 31 views
11

Hey tôi nhận được lỗi lạ này:sai lệch Const: 2 quá tải không có chuyển đổi pháp lý cho con trỏ 'này'

error C2663: 'sf::Drawable::SetPosition' : 2 overloads have no legal conversion for 'this' pointer

Tôi nghĩ rằng nó có cái gì để làm với sai lệch const nhưng tôi không biết nơi , hoặc tại sao. Trong đoạn mã sau, tôi có một vectơ các hình dạng và các vân, và khi cố truy cập một trong các hình dạng vectơ và gọi một trong các chức năng của nó, tôi đang gặp lỗi.

 std::vector<sf::Shape> Shapes; 
     std::vector<sf::Sprite> Sprites; 

    bool AddShape(sf::Shape& S){ 
     Shapes.push_back(S); return true;}; 
    bool AddSprite(sf::Sprite& S){ 
     Sprites.push_back(S); return true;}; 

private: 

virtual void Render(sf::RenderTarget& target) const {     
    for(unsigned short I; I<Shapes.size(); I++){ 
     Shapes[I].SetPosition(
      Shapes[I].GetPosition().x + GetPosition().x, 
      Shapes[I].GetPosition().y + GetPosition().y); 
     target.Draw(Shapes[I]);} 
    for(unsigned short I; I<Sprites.size(); I++){ 
     target.Draw(Sprites[I]);} 

làm cách nào tôi có thể sửa lỗi này ??

+0

Dòng nào xảy ra? –

+0

Tại sao câu hỏi này có điểm số cao như vậy? Xin lỗi, không có ý định phạm tội, nhưng không phải là nó rõ ràng? – Liviu

Trả lời

14

Render được khai báo với số const sau thông số. Điều này có nghĩa là nó không thay đổi đối tượng của nó. Có nghĩa là, tất cả các biến thành viên của đối tượng được coi là hằng số trong phạm vi Render, khi thay đổi trạng thái của chúng có nghĩa là thay đổi đối tượng chứa. Giả sử Shapes là biến thành viên và SetPosition thay đổi hình dạng (tức là không được khai báo là const), bạn không thể gọi nó trong một hàm thành viên const.

Vì vậy, hãy xóa const từ Render và bạn sẽ ổn (bạn sửa lỗi logic của mình, trong trường hợp nó phải là const).

+0

Anh ta không thể loại bỏ const; anh ta bắt nguồn từ một lớp cơ sở có lẽ đã đặt const đó ở đó để bắt đầu. –

+0

@Nicol Bolas, làm sao bạn biết? OP không nói gì về lớp có chứa 'Render', phải không? Và nếu anh ta làm và tôi đã bỏ lỡ điều đó, anh ta sẽ phải thay đổi nội dung của 'Render'. Bạn không thể thay đổi các biến thành viên bên trong một hàm thành viên 'const' (trừ khi bạn muốn hack mã riêng của mình và gây ngạc nhiên cho người dùng của nó). – eran

+0

Tôi đã đọc bài đăng cuối cùng của anh ấy; anh ấy tạo một SFML có thể vẽ được. –

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