如何修复“没有重载函数需要 2 个参数”错误 C++

Posted

技术标签:

【中文标题】如何修复“没有重载函数需要 2 个参数”错误 C++【英文标题】:How to fix 'no overloaded function takes 2 arguments' error C++ 【发布时间】:2020-01-11 01:01:22 【问题描述】:

我正在尝试为哈希表创建一个包含唯一指针的类,但每当我尝试向表添加指针时,我都会收到一个错误,该错误指向与我正在使用的库不同的文件。

我尝试使用.insert() 代替.emplace()。我试过传入一对键和指针。

这两者都导致了与原始错误不同的错误

这里是 Hash_Table 类:

///<summary>
/// A struct for a hash table
///</summary>
template <typename T>
struct Hash_Table

public:
    ///<summary>
    /// Add an item to the hash table & return the item key
    ///</summary>
    int addItem(T newItem) 
        // Make the item into a unique pointer
        std::unique_ptr<T> itemPtr = std::make_unique<T>(newItem);

        //std::pair<int, std::unique_ptr<T>> pair = std::make_pair(tailPointer, itemPtr);

        while (!Table.emplace(tailPointer, itemPtr).second) 
            tailPointer++;
            //pair.first++;
        

        tailPointer++;

        return tailPointer--;
    ;

private:

    ///<summary>
    /// The actual hash table
    ///</summary>
    std::unordered_map<int, std::unique_ptr<T>> Table;

    ///<summary>
    /// Points to the key of the last item added to the hash table
    ///</summary>
    int tailPointer;
;

当我尝试table.emplace() 时,问题发生在addItem() 函数中。

文件xmemory中的错误代码如上所示:

C2661: 'std::pair::pair': 没有重载函数 接受 2 个参数

使用table.insert()时文件HashTable.h中的错误:

C2664: 'std::_List_iterator>> std::_Hash>,std::_Uhash_compare<_kty>,_Alloc,false>>::insert(std::_List_const_iterator>>,const 标准::对>> &)': 无法将参数 1 从 'int' 转换为 'std::_List_const_iterator>>'

使用table.inserttable.emplace(std::make_pair(tailPointer, itemPtr)) 时文件实用程序出错:

C2440:“”:无法从“初始化列表”转换 到“_MyPair”

【问题讨论】:

Table.emplace(tailPointer, itemPtr) -> Table.try_emplace(tailPointer, std::move(itemPtr))(但 C++17)。 tailPointer++; 后跟 return tailPointer--; 让我有点困惑...... How do I pass a unique_ptr argument to a constructor or a function?的可能重复 Jarods 修复确实有效,非常感谢。 【参考方案1】:

解决问题的多种方法:

解决方案 1:

int addItem(T newItem) 
    // Make the item into a unique pointer
    std::unique_ptr<T> itemPtr = std::make_unique<T>(newItem);

    // Unique_ptr doesn't have assignment operator instead it has move-assignment.
    // So it need to be moved only
    std::pair<int, std::unique_ptr<T>> pair = std::make_pair(tailPointer++, std::move(itemPtr));

    // For same above reason, it must be moved
    Table.insert(std::move(pair));

    return tailPointer;
;

解决方案 2:

int addItem(T newItem) 
    Table.insert(std::make_pair(tailPointer++, std::make_unique<T>(newItem)));
    return tailPointer;

解决方案 3:

int addItem(T newItem) 
    Table[tailPointer++] = std::make_unique<T>(newItem);
    return tailPointer;

以上解决方案都不需要 C++ 17。全部来自 C++11。您应该了解为什么会出现编译错误。使用现有代码,您试图分配或复制不允许的 unique_ptr。它只能移动。这就是你的编译器试图告诉你的。

【讨论】:

【参考方案2】:

谢谢Jarod42,您的修复确实奏效了。

修复: Table.emplace(tailPointer, itemPtr) -> Table.try_emplace(tailPointer, std::move(itemPtr))(但 C++17)。 - Jarod42

【讨论】:

【参考方案3】:

使用它,将解决 c++11 中的 unique_ptr 问题

int addItem(T newItem)     
    // Make the item into a unique pointer
    while (!Table.emplace_hint(tailPointer, newItem).second) 
        tailPointer++;
        //pair.first++;
    
    tailPointer++;
    return tailPointer--;
;

【讨论】:

以上是关于如何修复“没有重载函数需要 2 个参数”错误 C++的主要内容,如果未能解决你的问题,请参考以下文章

如何修复致命错误 jvmti.h 没有这样的文件或目录编译终止 c 代码 ubuntu?

如何在 Windows 上修复 VS 2019 中的 SFML 错误?

如何修复“C# 7.0 语言功能”构建错误? (新结帐后,以前工作)

如何修复AddressOf需要轻松的对话委托错误

如何修复 Azure 管道错误 NETSDK1152?

为啥我会收到 IntelliSense 错误,如何修复或隐藏它们?