【问题标题】:Problem with declaring a protected pointer to a vector声明指向向量的受保护指针的问题
【发布时间】:2020-05-31 20:26:54
【问题描述】:

我正在尝试在 C++ 的派生类中声明指向 std::vector<int> 的指针。该类又是其他类的基类。

我的尝试如下

protected:
   std::vector<CustomClass> *mypointer;

但是,当我编译它时,我收到以下错误:

error: no match for ‘operator=’ (operand types are ‘std::vector<int>’ and ‘std::vector<int>*’)
error: no match for ‘operator*’ (operand type is ‘std::vector<int>’)

还有一些其他的操作数不见了。

我很茫然,问题出在哪里。我必须在当前类中实现所有这些功能吗?如果是这样,我为什么要这样做?

对于任何需要更多上下文的人,我想在派生自 CbmStsElement 的类 CbmStsSensor (found here) 中实现该指针。

编辑:一些相关的课程可以在这里CbmStsElement.henter link description here找到。

Edit2:整个编译错误日志可以在here找到。

【问题讨论】:

  • Firefox 警告我该网站存在潜在的安全风险。提交问题中的所有相关代码,而不是作为外部网站的链接。
  • 您显示的 sn-p 不足以诊断问题。错误消息听起来像是您正在尝试将非指针分配给mypointer
  • @John 添加了两个相关文件。
  • @StephenNewell 问题是,我什至没有尝试分配任何东西。只需声明该指针,给定消息就已经发生编译错误。
  • 这距离minimal reproducible example 还差得很远。

标签: c++ c++11 pointers vector compiler-errors


【解决方案1】:

错误信息足够清晰。例如,在代码中的某处,您尝试将指向 std::vector&lt;int&gt; * 类型的对象的指针分配给 std::vector&lt;int&gt; 类型的对象。

这是一个演示程序,显示了如何生成此错误消息。

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v1;
    std::vector<int> v2;

    v1 = &v2;

    return 0;
}

编译错误是

prog.cpp: In function ‘int main()’:
prog.cpp:9:8: error: no match for ‘operator=’ (operand types are ‘std::vector<int>’ and ‘std::vector<int>*’)
  v1 = &v2;
        ^~

或者(相对于第二条错误消息)std::vector&lt;int&gt; 类型的对象没有一元 operator *

这是另一个演示程序

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v;

    *v;

    return 0;
}

错误信息是

prog.cpp: In function ‘int main()’:
prog.cpp:8:2: error: no match for ‘operator*’ (operand type is ‘std::vector<int>’)
  *v;
  ^~

也许您应该将数据成员声明为具有std::vector&lt;int&gt; 类型而不是指针类型。

【讨论】:

  • 它不应该是第一个,因为仅仅通过声明那个指针我已经收到了编译错误消息。你能解释一下后者吗?
  • @Rhynden 我没明白你的意思。
  • 仅仅通过声明指针,我已经得到编译错误,所以我不明白为什么我得到错误for operator=。一个简单的 std::vector 不应该有运算符 * 吗?
  • @Rhynden 编译器通常会显示导致错误的代码。
  • 遗憾的是,我不能将其声明为简单向量,因为其他类派生自该类,但它们都必须共享相同的向量,此外,该向量是从另一个类传递的。我添加了整个编译日志,如果您想看一下。
【解决方案2】:

问题不在于 c++ 代码本身,而在于它使用的框架,在本例中为 ROOT。如果在 ROOT 类中定义一个指针,则必须告诉程序在将类写入文件的情况下如何处理该指针。即使该类可能永远不会被写入文件(就像我的情况一样)。 在这种特定情况下(永远不会将类写入文件),您可以通过在声明后添加 //! 来简单地告诉 ROOT 忽略给定的指针,例如写

protected:
   std::vector<CustomClass> *mypointer; //!

感谢大家在这个无助的案例中提供帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多