我正在开发一个类的项目,我将在C ++中实现cuckoo哈希。问题是,C ++和我从来都不是朋友,我想我们永远不会......
具体问题是,我无法在已经存在的Object上设置指针。当我这样做时,我得到编译错误:
没有可行的从'const std :: __ 1 :: basic_string转换为'std :: __ 1 :: basic_string '*
两个语句都出错:
E * activeE = e;
E * tempE = v1[pos];
v1是E Objects的数组。
我认为这个错误是由于我对C ++基本概念的误解。我想对你们这个问题是一个玩笑,但我希望你能帮助我。
template <typename E, size_t N>
void Hashing<E,N>::add_(const E& e) {
size_t pos = h1(e);
size_t i = 0;
E * activeE = e;
E * tempE = v1[pos];
while (i < nmax) {
if (tempE == NULL) {
v1[pos] = activeE;
break;
}
v1[pos] = activeE;
activeE = tempE;
pos = h2(activeE);
tempE = v2[pos];
if (tempE == NULL) {
v2[pos] = activeE;
break;
}
v2[pos] = activeE;
activeE = tempE;
pos = h1(activeE);
tempE = v1[pos];
}
}
答案 0 :(得分:1)
你确定吗?我不认为这是错误所说的。我敢打赌它说:我收到编译错误:
没有可行的转换从&#39; const std :: __ 1 :: basic_string到&#39; std :: __ 1 :: basic_string&#34;
No viable conversion from 'const std::__1::basic_string to 'std::__1::basic_string*'
请注意非常重要的额外*
,并且是您问题的根源。你需要注意错误信息,细节很重要。
指针是一个保存其他东西地址的变量,因此要创建指向对象的指针,需要使用&#34;&#34;的地址。运算符&
,以获取该对象的地址。
E* activeE = &e;
现在您将收到您声明要获取的错误,这是因为e
是const
,但您正在尝试创建一个非const指针。这是禁止的,因为它允许你通过指针修改const
对象。你需要:
const E* activeE = &e;
答案 1 :(得分:1)
您在const E& e
方法中有Hashing<E,N>::add_
,但在其中您将e
指定给指向E
的指针 - 实际上这会产生不同的错误:
'const std::__1::basic_string to 'std::__1::basic_string*"
^
所以修复,为此要改变:
E * activeE = e;
E * tempE = v1[pos];
到
const E * activeE = &e;
const E * tempE = &v1[pos];
答案 2 :(得分:1)
const E& e ... E * activeE = e;
我敢打赌,您错过了该错误消息中的一些选定字符,例如*
和&
。您正在尝试为指针分配E
值。
由于您似乎不清楚对象,值和地址之间的区别,我不会猜测v1
是vector<E>
还是vector<E*>
。而且,通过扩展,我不会猜测应该如何修复这条线。至少有两种可能的修复方式具有完全不同的含义。