【问题标题】:No viable conversion from 'const std::__1::basic_string<char> to 'std::__1::basic_string<char> *'从 'const std::__1::basic_string<char> 到 'std::__1::basic_string<char> *' 没有可行的转换
【发布时间】:2016-05-17 08:45:27
【问题描述】:

我目前正在为一个类开发一个项目,在该项目中我必须在 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];
    }

}

【问题讨论】:

  • 该错误消息的末尾应该有一个*。注意星星,它们在 C++ 中很重要
  • 你混淆了指针和引用。
  • 您将引用变量分配给指针变量。类型不匹配。但是您提供的错误信息与您的代码不匹配。
  • 你是对的,有一个*
  • @backfloep 在这种情况下,请编辑您的问题并修复它。

标签: c++ c++11


【解决方案1】:

您在 Hashing&lt;E,N&gt;::add_ 方法中有 const E&amp; e,但在其中您将 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];

【讨论】:

  • 非常感谢!
  • 但是,我会避免获取通过const 引用传入的参数的地址,因为它可能指的是临时的。最好将参数类型更改为指针,或者 - (可能更好) - 复制值(如果要存储指针,则需要 E 为指针类型)。
  • @backfloep 您应该确保每个E 实例在您的Hashing&lt;E,N&gt; 实例生命周期内都处于活动状态,否则您将有未定义的行为(== 崩溃)。最好的方法是标准库正在做的事情,容器按值保存对象,如果您需要速度,则允许您的 Hashing 容器使用移动语义。
【解决方案2】:

我得到编译错误:

没有从 'const std::__1::basic_string 到 'std::__1::basic_string" 的可行转换

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

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

请注意额外的*,它非常很重要,是问题的根源。你需要注意错误信息,细节很重要。

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

E* activeE = &e;

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

const E* activeE = &e;

【讨论】:

  • 正如我在 marcinj 的回答中所指出的,采用(尤其是存储)作为 const 引用传递的参数的地址并不是一个好习惯。该参数可能指的是临时的。
【解决方案3】:

const E&amp; e ... E * activeE = e;

我敢打赌,您错过了该错误消息中的一些选定字符,例如 *&amp;。您正在尝试将 E 值分配给指针。

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

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2017-03-10
    • 2015-04-28
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2014-03-02
    相关资源
    最近更新 更多