C++ 从C+;中的另一个构造函数调用构造函数时出错+;

C++ 从C+;中的另一个构造函数调用构造函数时出错+;,c++,c++11,constructor,ctor-initializer,C++,C++11,Constructor,Ctor Initializer,我有一个struct a,它有几个初始化了不同数据成员的构造函数 template<typename T> struct A { typedef std::vector<T> type1 type1 a; type1 b; type1 c; A(type1 i_a): a(i_a) { } A(type1 i_a, type1 i_b): A(i_a), b(i_b) { } A(ty

我有一个
struct a
,它有几个初始化了不同数据成员的构造函数

template<typename T>
    struct A {

    typedef std::vector<T> type1
    type1 a;
    type1 b;
    type1 c;

    A(type1 i_a): a(i_a) {
    }

    A(type1 i_a, type1 i_b): A(i_a), b(i_b) {
    }

    A(type1 i_a, type1 i_b, type1 i_c): A(i_a, i_b), c(i_c) {
    }
};
模板
结构A{
typedef std::向量类型1
类型1 a;
类型1b;
1类c;
A(类型1 i_A):A(i_A){
}
A(类型1 i_A,类型1 i_b):A(i_A),b(i_b){
}
A(类型1 i_A,类型1 i_b,类型1 i_c):A(i_A,i_b),c(i_c){
}
};
我得到的错误是,当我用say
custom\u type
实例化它时,错误是
类型A不是突出显示我在另一个构造函数中调用的构造函数的直接基。我正在使用C++11。有什么问题吗?

一个构造函数可以初始化它的基类和成员,或者委托给同一个类的另一个构造函数,而不是两者都初始化

A(i\u A)
构造一个完整的
A
对象,复制成员
A
并默认构造
b
c
。因此,让
A(type1i_A,type1i_b)是没有意义的:A(i_A),b(i_b){}
-第一个初始值设定项已经初始化
b
。你可以改为

A(type1 i_a, type1 i_b) : A(i_a) { b = std::move(i_b); }

但是您仍然可以从构造函数体中调用同一类的不同构造函数(如果出于某种原因您希望)

类CComplex{
公众:
CComplex(int real1、int image1、char c)
{

coutaschepler提供了答案,但我想解释导致问题的原因,并展示授权构造函数以避免问题的“最佳实践”

在你的代码中有一系列的构造函数,每一个都比它们委托给的构造函数更一般。也就是说,你试图让一个构造函数委托给一个更专业的构造函数,而这个构造函数并不做所有的事情,然后你加上一点工作来处理额外的一般性。这与最实际的做法是相反的cal是早期支持它的语言中构造委托的一种方式

相反,您希望让最通用的构造函数成为委托的“根”(其他语言中的“指定初始值设定项”或“指定构造函数”)。更专业的构造函数将使用更通用的构造函数来完成工作,并将要处理的特殊情况的数据传递给他们

在您的情况下,专门化的行为是对某些成员使用默认值,而不是从用户处获取初始值。因此,更专业的构造函数将通过传递给定的参数以及其他成员的默认值来完成其工作

template<typename T>
struct A
{
    typedef std::vector<T> type1;
    type1 a;
    type1 b;
    type1 c;

    A(type1 i_a, type1 i_b, type1 i_c): a(i_a), b(i_b), c(i_c) {}

    A(type1 i_a, type1 i_b): A(i_a, i_b, {}) {}

    A(type1 i_a): A(i_a, {}) {}
};
模板
结构A
{
typedef std::向量type1;
类型1 a;
类型1b;
1类c;
A(类型1 i_A,类型1 i_b,类型1 i_c):A(i_A),b(i_b),c(i_c){}
A(类型1 i_A,类型1 i_b):A(类型1 i_A,i_b,{}{}
A(类型1 i_A):A(i_A,{}{}
};

什么编译器和选项?看起来你没有使用C++11,即使你打算这么做。这可能是因为你的编译器不支持委托构造函数。你使用的编译器和版本是什么?我使用
g++-std=C++0x
如果这是你的意思的话?版本是4.6我不确定它是否允许合并对其他cons的调用具有直接初始化成员的卡车司机-如果您删除
b
c
的初始值,则此功能将正常工作,因为它可能重复:“如果mem初始值设定项id指定了构造函数的类,那么它将是唯一的mem初始值设定项;该构造函数是一个委托构造函数,并且由mem初始值设定项选择的构造函数是目标构造函数。“从15.6.2P6开始,这个问题就是为什么通常最好让参数较少的构造函数委托给参数较多的构造函数;将所有内容委托给最通用的构造函数,而专门的构造函数只需将默认值发送给更通用的构造函数即可完成其工作。我不确定这个说法“因此,
A(type1i_A,type1i_b)是没有意义的:A(i_A),b(i_b){}
-第一个初始值设定项已经初始化了
b
“这听起来像是一个合理的初始化对象的方法,然后覆盖了代码> b>代码>值。至于C++标准是否有问题,它是另一个问题。question@icepack:Mem初始值设定项导致调用构造函数。每个(子)仅调用一个构造函数重写将是一个赋值,而不是一个初始化。我知道,我只是说,在语言中启用这样的操作不是一个不合理的请求-例如,如果mem initializer遵循构造函数调用,编译器可以忽略此字段的初始化,并将其延迟到mem initializer调用当然,使用
ccc
cccc
将无法像委托构造函数那样帮助初始化原始的
CComplex
对象。这与问题有何关系?在任何情况下,这与从函数内部调用重载函数的另一个版本(甚至是同一个版本)没有什么不同我想说明调用不同版本的构造函数仍然是可能的。可能它们根本不同。您的内部构造函数调用与完全不同的对象相关。很有趣。感谢您的解决方案。我本来会将此标记为答案的,但我想现在取消标记另一个是不礼貌的。
{}
在额外参数的位置表示?@user592748,这是为这些参数默认构造值的统一初始化语法。
template<typename T>
struct A
{
    typedef std::vector<T> type1;
    type1 a;
    type1 b;
    type1 c;

    A(type1 i_a, type1 i_b, type1 i_c): a(i_a), b(i_b), c(i_c) {}

    A(type1 i_a, type1 i_b): A(i_a, i_b, {}) {}

    A(type1 i_a): A(i_a, {}) {}
};