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

新手上路,请多包涵

我目前正在为一个类项目工作,在该项目中我必须在 C++ 中实现布谷鸟散列。问题是,我和 C++ 从来都不是朋友,我认为我们永远不会…

具体问题是,我无法在已经存在的对象上设置指针。当我这样做时,我得到编译错误:

从 ‘const std::__1::basic_string 到 ‘std::__1::basic_string ‘* 没有可行的转换

两个语句都会出现错误:

 E * activeE = e;
E * tempE = v1[pos];

v1 是一个 E 对象数组。

我认为这个错误是由于我对 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];
    }

}

原文由 backfloep 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

You have const E& e in Hashing<E,N>::add_ method, but inside of it you assign e to pointer to E - actually this should generate different error:

  '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];

原文由 marcinj 发布,翻译遵循 CC BY-SA 3.0 许可协议

我得到编译错误:

从 ‘const std::1::basic_string 到 ‘std::1::basic_string” 没有可行的转换

你确定吗?我不认为这就是错误所说的。我敢打赌它说:

No viable conversion from 'const std::__1::basic_string to 'std::__1::basic_string*'

请注意额外的 * 非常 重要,并且是问题的根源。您需要注意错误消息,细节很重要。

指针是保存其他地址的变量,因此要创建指向对象的指针,您需要使用“地址”运算符 & 来获取该对象的地址。

 E* activeE = &e;

现在你会得到你声称得到的错误,这是因为 econst ,但你正在尝试创建一个指向它的非常量指针。这是禁止的,因为它会让您通过指针修改 const 对象。你需要:

 const E* activeE = &e;

原文由 Jonathan Wakely 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题