C ++ - struct构造函数,在尝试取消引用指向struct的指针时发生重新定义错误

时间:2014-11-25 23:55:43

标签: c++ constructor

在定义构造函数重载时,其唯一目的是取消引用值,我得到一个我想要理解的错误。

以下是代码:

struct _tv {
    string t;
    void* v;
    _tv(string _t, void* _v) {
        t = _t;
        v = _v;
    };
    _tv(_tv* v) { _tv(*v); }; // A
};

由于以下原因而无法编译:

error: redefinition of 'v'
  _tv(_tv* v) { _tv(*v); };

我想要做的是能够像这样构建_tv:

// Suppose 'a' is a valid _tv*
_tv* b = new _tv(a); // B

如果我从代码中删除该行(A),它会编译,我可以用以下结果获得相同的结果:

_tv* b = new _tv(*a);

但我不想那样,我想理解为什么它不起作用以及为什么错误表明我正试图重新定义参数'v'。

2 个答案:

答案 0 :(得分:4)

_tv(*v);

声明一个类型为“_tv指针”的变量。该变量的名称为v

考虑[dcl.meaning] / 6:

  

在声明T DD的格式为

     

(D1)

     

包含的 declarator-id 的类型与   声明中包含 declarator-id

  T D1
     

括号不会改变嵌入的 declarator-id 的类型,但是   他们可以改变复杂声明者的绑定。

似乎你想使用委托构造函数:

_tv(_tv* v) : _tv(*v) {}

定义合适的复制构造函数(如有必要)。

答案 1 :(得分:1)

struct _tv {
    string t;
    void* v;
    _tv(string _t, void* _v) {
        t = _t;
        v = _v;
    }
    _tv(_tv* ptr) {
        t = ptr->t;
        v = ptr->v;
    } // A
};

你要做的是构造函数委托,算法需要名为ptr的指针而不是影子v https://en.wikipedia.org/wiki/C++11#Object_construction_improvement

还保留了前导下划线名称 What are the rules about using an underscore in a C++ identifier?