没有可行的从'const std :: __ 1 :: basic_string <char>到'std :: __ 1 :: basic_string <char> *'的转换

时间:2016-05-17 08:45:27

标签: c++ c++11

我正在开发一个类的项目,我将在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];
    }

}

3 个答案:

答案 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;

现在您将收到您声明要获取的错误,这是因为econst,但您正在尝试创建一个非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值。

由于您似乎不清楚对象,值和地址之间的区别,我不会猜测v1vector<E>还是vector<E*>。而且,通过扩展,我不会猜测应该如何修复这条线。至少有两种可能的修复方式具有完全不同的含义。