【问题标题】:error C2280: attempting to reference a deleted function (trying to call vector.erase)错误 C2280:试图引用已删除的函数(试图调用 vector.erase)
【发布时间】:2014-09-15 06:24:28
【问题描述】:

我是 C++ 新手。我正在使用 SFML 和 Box2D 开发突破克隆,编译时出现此错误。错误详情:

c:\program files (x86)\visual studio express 2013\vc\include\xutility(2420): error C2280: 'Tile &Tile::operator =(const Tile &)' : attempting to reference a deleted function
c:\users\harry\documents\visual studio 2013\projects\cpp-breakout\cpp-breakout\entities\tile.hpp(27) : compiler has generated 'Tile::operator =' here

当我尝试使用 vector.erase 从 std::vector 中擦除 Tile 对象时出现错误。

Tile.h

class Tile : public Entity {
public:
    Tile(b2World* world, float posX, float posY);
    void draw(sf::RenderWindow& window);

    const float PTM_RATIO = 32.f;
    const int HALF_WIDTH = 32;
    const int HALF_HEIGHT = 16;
    int armor;
    bool flaggedToErase = false;

    b2Body* tileBody;
    sf::Sprite sprite;
};

Tile.cpp

Tile::Tile(b2World* world, float posX, float posY)
{
    // Define a body.
    b2BodyDef tileBodyDef;
    tileBodyDef.type = b2_staticBody;
    tileBodyDef.position.Set((posX + HALF_WIDTH) / PTM_RATIO, (posY + HALF_HEIGHT) / PTM_RATIO);

    // Use the body definition to create the actual body instance.
    tileBody = world->CreateBody(&tileBodyDef);
    tileBody->SetUserData(this);
    // Define shape.
    b2PolygonShape tileShape;
    tileShape.SetAsBox(HALF_WIDTH / PTM_RATIO, HALF_HEIGHT / PTM_RATIO);

    // Define fixture.
    b2FixtureDef tileFixtureDef;
    tileFixtureDef.shape = &tileShape;
    tileFixtureDef.density = 10.0f;
    tileFixtureDef.restitution = 0.1f;
    tileFixtureDef.friction = 0.0f;
    //tileFixtureDef.isSensor = true;

    bUserData* bud = new bUserData;
    bud->entityType = TILE;
    tileFixtureDef.userData = bud;

    // Create fixture.
    tileBody->CreateFixture(&tileFixtureDef);
}

我将 Tiles 推到向量中

Level.cpp

std::vector<Tile> solidTiles;

void Level::loadLevel(b2World* world) {
    // Loop through the map and set the tile position and sprites to the tiles.
    for(unsigned int i = 0; i < map.size(); i++) {
        for(unsigned int j = 0; j < map[i].size(); j++) {
            // Set sprites to the tiles in every grid cell which is not -1,-1.
            if(map[i][j].x != -1 && map[i][j].y != -1) {
                Tile tempTile(world, j * TILE_WIDTH, i * TILE_HEIGHT);
                tempTile.sprite = tiles;
                tempTile.sprite.setOrigin(sf::Vector2f(HALF_WIDTH, HALF_HEIGHT));
                tempTile.sprite.setTextureRect(sf::IntRect(map[i][j].x * TILE_WIDTH, map[i][j].y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT));
                tempTile.sprite.setPosition(sf::Vector2f(tempTile.tileBody->GetPosition().x * PTM_RATIO, tempTile.tileBody->GetPosition().y * PTM_RATIO));
                solidTiles.push_back(tempTile);
            }
        }
    }
}

我尝试擦除其中的瓷砖

PlayState.cpp

void PlayState::removeSprites() {
    for(unsigned int i = 0; i < level1.solidTiles.size(); i++) {
        if(level1.solidTiles[i].flaggedToErase == true) {
            level1.solidTiles.erase(level1.solidTiles.begin() + i);
        }
    }
}

问题是否与移动构造函数/赋值有关?

【问题讨论】:

  • 我不知道你的班级的哪一部分导致它(Entitysf::Sprite?),但你的班级似乎不可复制。如果您不使用 C++11,则不能在向量中使用它。如果使用 C++11,向量可以与只移动类型一起使用。
  • 你的const 成员Tile 应该是静态的。
  • @Brian 非常正确 - 但是他可能还需要编写复制赋值运算符,具体取决于 b2Body* tileBody; 的语义

标签: c++ vector compiler-errors deleted-functions


【解决方案1】:

由于类Tile 有一个const 数据成员,因此它由编译器复制赋值运算符隐式定义为deleted

您必须自己显式地定义复制赋值运算符。

【讨论】:

  • 谢谢!我一直在尝试阅读有关复制/移动构造函数和赋值运算符的信息,并且来自 Python 和 C# 背景,我变得非常困惑。尤其是当我在 Tile 构造函数中有这么多代码时。您能否举一个示例如何做到这一点,或者有什么好的参考资料可供 C++ 新手阅读,以便我可以实现它?
【解决方案2】:

该错误清楚地提到了Tile &amp;Tile::operator =(const Tile &amp;),所以它是关于赋值运算符,而不是移动赋值运算符。您需要为Tile 实现它。您还缺少Tile 的复制构造函数。

引用here

隐式声明或默认的复制赋值运算符 类 T 被定义为删除以下任何一项为真:

  • T 有一个非静态数据成员是 const
  • T 有一个引用类型的非静态数据成员。
  • T 具有无法复制分配的非静态数据成员(已删除、无法访问或不明确的复制分配运算符)
  • T 具有无法复制分配的直接或虚拟基类(已删除、无法访问或不明确的移动分配运算符)
  • T 有一个用户声明的移动构造函数
  • T 有一个用户声明的移动赋值运算符

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2014-01-10
    相关资源
    最近更新 更多