删除函数,std :: pair <std :: string,asset =“”>引用

时间:2015-11-25 00:34:00

标签: c++ c++11

我有以下课程:

class AssetManager
{
public:
    AssetManager();
    AssetManager(std::vector<const char *> sources);
    ~AssetManager();
    bool addSource(const char *file);
    std::vector<char> getAsset(const char *name);

private:
    class Asset
    {
    public:
        Asset(const char *name, std::size_t size, std::size_t location, std::ifstream &inputStream);
        ~Asset();
        const char *getName();
        std::size_t getSize();
        std::size_t getLocation();
        std::ifstream &getInputStream();

        //makes the name 16 bytes and filled with 0's
        static const char *makeName(const char *name);

    private:
        char name_[ASSET_NAME_LENGTH];
        std::size_t size_;
        std::size_t location_;
        std::ifstream &inputStream_;
    };
    Asset *findAssetByName(std::string &name, std::size_t start, std::size_t end);
    std::vector<std::pair<std::string, Asset>> sortedNames_;
    std::vector<std::ifstream> inputStreams_;
};

导致问题的代码部分:

AssetManager::AssetManager(std::vector<const char*> sources) : inputStreams_(sources.size())
{
    //some code....

    std::sort(sortedNames_.begin(), sortedNames_.end(),
        [](std::pair<std::string, Asset> const& a,
            std::pair<std::string, Asset> const& b){return a.first.compare(b.first) < 0;});
}

尝试编译时出现以下错误

Severity    Code    Description Project File    Line
Error   C2280   'AssetManager::Asset &AssetManager::Asset::operator =(const AssetManager::Asset &)': attempting to reference a deleted function c:\program files (x86)\microsoft visual studio 14.0\vc\include\utility  175

我知道问题是参数,但我不明白为什么。如果const std::pair<std::string, Asset> const& a是对一对字符串和资产的引用,为什么调用赋值运算符?

1 个答案:

答案 0 :(得分:0)

通过排序调用赋值运算符以交换两个乱序的元素。它在您的情况下使用,因为没有定义swap(Asset &, Asset &)函数,因此使用默认swap,它将通过临时复制。

在技术方面,sort要求它的参数为ValueSwappable,而参与成员的类不会是。{/ p>

您需要提供交换或赋值运算符才能进行排序。