无法从 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));
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));