无法从 const_Ty2* 转换为 ValueType*

Cannot convert from const_Ty2* to ValueType*

template <typename ValueType> ValueType* RadixTree<ValueType>::search(std::string key) const {
    typename std::map<std::string, ValueType>::const_iterator it = radixTree.find(key);
    if (it == radixTree.end())
        return nullptr;
    return &(it->second);
}

您好!上面是我的代码,它是我的 radixTree 实现的占位符。我不明白为什么我需要第二行 std::map 之前的类型名,以及为什么 &(it->second) 最终会返回 const_Ty2*。我认为在这种情况下,const_Ty2 和 ValueType 是等价的。变量 radixTree 当前是一个 Map,虽然我想用我的 radixTree 实现替换它,但我也想了解我现在遇到的问题。任何帮助将不胜感激。谢谢!

跟进: 我也遇到了这个方法的问题

template <typename ValueType> void RadixTree<ValueType>::insert(std::string key, const ValueType& value) {
    radixTree.insert(key, value);
}

并且 radixTree 声明为 std::map<std::string,ValueType> radixTree; 这种方法给了我一个很长的错误,我不太明白。

std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,ValueType>>>> std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::insert(std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,ValueType>>>>,std::pair<const std::string,ValueType> &&)': cannot convert argument 1 from 'std::string' to 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,ValueType>>>>

有人可以帮我解决这个问题吗?再次感谢!

您的函数是 const,并且您正确地使用了 const_iterator。这意味着 it->second 也是 常量。当您执行 &it->second 时,它变成了一个无法隐式转换为 non-const 指针的 const 指针(这种转换会丢弃 const 限定符)。

不清楚为什么要 non-const 指向内部值的指针。我必须假设这是一个错误。您应该将 return 类型更改为 const ValueType*.

关于您刚刚对问题所做的编辑:

radixTree.insert(key, value);

消息告诉您函数参数错误。检查插入函数的 documentation。您会发现它需要 value_type,即 std::pair<const Key, T>。错误的有用部分在这里:

cannot convert argument 1 from 'std::string' to 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,ValueType>>>>

它试图匹配一个有两个参数的调用,重载解析试图将其解析为 insert(const_iterator hint, const value_type &value)。那应该告诉你有什么不对。

试试这个:

radixTree.insert(std::make_pair(key, value));