【问题标题】:C++ No compatible standard constructor foundC++ 找不到兼容的标准构造函数
【发布时间】:2013-10-29 11:36:51
【问题描述】:

我在头文件中创建了以下类:

class clsJoinFeeder
{
public:
    vector<vector<float>>&Floats;
    vector<vector<unsigned char>>&UnsignedChars;
};

我还没有使用这个类(以避免任何额外的错误)。

编译器告诉我“找不到兼容的构造函数”。

为什么编译器会这样告诉我?我不想使用构造函数。我的课程仅用于保存这些值。

【问题讨论】:

  • 小提示:在某些编译器(如 Sun CC)上,&gt;&gt; 被解释为位移。所以你需要在两者之间放一个空格,比如&gt; &gt;

标签: c++ class vector constructor


【解决方案1】:

您的类不包含任何数据值,它包含对具有数据值的(外部)容器的引用。引用的必须用一些东西来初始化,因为在对象构造之后它们的指针不能被改变(如果构造函数中没有给出指针,它们就变得无用了)。

如果你想要一个类保存数据,你可能应该在不使用引用的情况下定义它:

class clsJoinFeeder
{
public:
    vector<vector<float> > Floats;
    vector<vector<unsigned char> > UnsignedChars;
};

如果你需要引用,你必须定义构造函数来初始化它们:

class clsJoinFeeder
{
public:
    vector<vector<float> > &Floats;
    vector<vector<unsigned char> > &UnsignedChars;

    clsJoinFeeder(         
        vector<vector<float> > &Floats0,
        vector<vector<unsigned char> > &UnsignedChars0
    ) : Floats(Floats0), UnsignedChars(UnsignedChars0) 
    { /*or maybe some code here*/ }
};

【讨论】:

  • 谢谢。我猜你是对的。我认为我的整个构造并不好。我会努力改变的。
  • 我知道这是一个很有趣的问题,但是如果我使用引用有什么区别呢?当我不使用引用时,这是否意味着当我访问它的一个值时会复制整个 > ,例如像这样? unsigned char btIndex=this->UnsignedChars[10][100];
  • @tmighty 引用本身并不保存数据,它就像指针,更具体地说,它就像“已经自行取消引用”的常量指针 - 让我们有 char * const p = &amp;x;char &amp;r = x;r(*p) 几乎相同,并且在大多数代码结构中都可以互换。与其他对象一样,向量在您分配它们(它们本身,而不是它们的字段)或按值传递它们时会被复制。使用this-&gt;UnsignedChars[10][100],您将调用两个向量对象(UnsignedChars 及其第 10 个元素)的两次访问方法operator [],这将永远不会复制其中任何一个。
  • 而且,顺便说一下,vector 的方法operator [] 会返回一个reference 到被访问的元素,而不是它的副本。通过这样做,它不仅跳过了冗余的复制构造,而且使您可以直接更改引用的元素,驻留在向量内。
  • 向量和其他对象一样,在您分配它们(它们本身,而不是它们的字段)或按值传递它们时被复制或按值返回(!)
【解决方案2】:

该类包含两个对向量的引用。但是对于哪些向量?要创建该类的实例,您需要一种方法来初始化引用以指向一些真实对象。

由于您自己没有声明构造函数,因此编译器会尝试生成默认构造函数。这失败了,因为它不知道如何初始化引用。

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2013-03-03
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多