Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不明确的构造函数调用(我假设)_C++_Ambiguous - Fatal编程技术网

C++ 不明确的构造函数调用(我假设)

C++ 不明确的构造函数调用(我假设),c++,ambiguous,C++,Ambiguous,我有一个矩阵类,定义如下: template <typename T, unsigned int N, unsigned int M> class TMatrixNxM //Rows x columns { public: TMatrixNxM(T = T(0)); //Default constructor TMatrixNxM(const std::array<std::array<T, M>, N>&); //Construct

我有一个矩阵类,定义如下:

template <typename T, unsigned int N, unsigned int M>
class TMatrixNxM //Rows x columns
{
public:
    TMatrixNxM(T = T(0)); //Default constructor
    TMatrixNxM(const std::array<std::array<T, M>, N>&); //Construct from array
    TMatrixNxM(std::initializer_list<std::initializer_list<T>>); //Initializer

    //...
private:
    std::array<std::array<T, M>, N> data; //ROW-MAJOR
};
(注意:Matrix3x3是TMatrixNxM的typedef,而且它位于数学名称空间中)

直到现在,它仍然有效,因为我并不总是有那个数组构造函数,只有初始化器列出了一个。但是现在,编译器甚至还没有完成编译,它崩溃了!(我收到“停止工作”弹出窗口,我必须关闭它,我使用的是MS VS Express 2013)

如果我这样做:

Math::Matrix3x3 b = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
那么它工作得很好。这就是我所假定的:

当我这样做的时候,就没有歧义了,因为你只能用这种方式调用初始化器\u list构造函数。对于第一种方法,编译器可能会混淆,因为数组是聚合类型,这意味着初始化以双大括号开始,如:{{…},但由于我有一个初始值设定项列表,我必须使用双大括号。但这真的应该是个问题吗,因为我从来没有做过双大括号,那些是大括号列表中的单大括号列表

这里到底发生了什么?我该如何解决这个问题

谢谢你抽出时间

编辑

如果我让构造函数按常量指针获取数组,编译器就不会崩溃(因为我从来不会在构造函数调用中直接扑通数组,我有初始化列表):

TMatrixNxM(const std::array*);
然而,有人能解释什么是一个实际的问题之前,我的假设是正确的吗

下面是一个可用于测试的最小可编译(或不可编译)代码:

#include <array>
#include <initializer_list>

template <typename T, unsigned int N, unsigned int M>
class TMatrixNxM //Rows x columns
{
public:
    TMatrixNxM(T = T(0));
    TMatrixNxM(const std::array<std::array<T, M>, N>&);
    TMatrixNxM(std::initializer_list<std::initializer_list<T>>);
private:
    std::array<std::array<T, M>, N> data; //ROW-MAJOR
};

template <typename T, unsigned int N, unsigned int M>
TMatrixNxM<T, N, M>::TMatrixNxM(T par_value)
{
    std::array<T, M> temp;
    temp.fill(par_value);
    data.fill(temp);
}


template <typename T, unsigned int N, unsigned int M>
TMatrixNxM<T, N, M>::TMatrixNxM(const std::array<std::array<T, M>, N> &par_values)
{
    data = par_values;
}


template <typename T, unsigned int N, unsigned int M>
TMatrixNxM<T, N, M>::TMatrixNxM(std::initializer_list<std::initializer_list<T>> par_values)
{
    int i = 0;

    for(std::initializer_list<T> row : par_values)
    {
        int j = 0;

        for(T value : row)
        {
            data[i][j] = value;
            ++j;
        }

        ++i;
    }
}

int main()
{
    TMatrixNxM<float, 3, 3> b({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});

    return 0;
}
#包括
#包括
样板
类TMatrixNxM//行x列
{
公众:
T矩阵nxm(T=T(0));
TMatrixNxM(const std::array&);
TMatrixNxM(标准::初始值设定项列表);
私人:
std::数组数据;//行主
};
样板
TMatrixNxM::TMatrixNxM(T参数值)
{
std::阵列温度;
填充温度(标准值);
数据填充(临时);
}
样板
TMatrixNxM::TMatrixNxM(常数std::数组和par_值)
{
数据=par_值;
}
样板
TMatrixNxM::TMatrixNxM(标准::初始值设定项列表参数值)
{
int i=0;
对于(标准::初始值设定项列表行:par_值)
{
int j=0;
对于(T值:行)
{
数据[i][j]=数值;
++j;
}
++一,;
}
}
int main()
{
tmatrixnxmb({{1,2,3},{4,5,6},{7,8,9});
返回0;
}

如果您用数组注释掉构造函数声明/定义,那么它应该可以很好地编译和执行。如前所述,我使用的是MS VS Express 2013的编译器。

看起来它在微软的编译器上不起作用。我尝试在使用GCC的Linux机器上编译相同的代码,它编译起来没有问题。它确实在调用初始值设定项列表构造函数。如果我在变量中生成一个数组并传递它,它也可以很好地编译,并调用数组构造函数:

std::array<float, 3> a = {{1, 2, 3}};
std::array<std::array<float, 3>, 3> b = {{a, a, a}};

TMatrixNxM<float, 3, 3> mat(b);
std::数组a={{{1,2,3};
数组b={{a,a,a};
TMatrixNxM垫(b);
如果我直接初始化数组,它还会编译并调用数组构造函数:

TMatrixNxM<float, 3, 3> mat({{ {{1, 2, 3}}, {{4, 5, 6}}, {{7, 8, 9}}  }});
TMatrixNxM-mat({{{{{{1,2,3},{{{4,5,6},{{{7,8,9}});

您必须提供一个小而完整的代码示例来展示您的问题(即其他人可以编译)。从你提供的部分信息来看,我看不出有什么问题。。。。我的编译器也不能。@MattMcNabb好的,有必要在构造函数中复制数组两次吗?你们知道传递值的作用是什么吗?我知道,我以前是通过常量引用来实现的,但后来我为了测试而删除了它,忘记了添加它,但即使使用常量引用,它也不会编译,所以这并不重要。。。GCC说A,微软说B,所以微软有一个bug?它不是那样工作的。微软不必与GCC兼容,甚至不必尝试与GCC兼容。它试图实现C++标准。GCC也是如此。而且都有bug。有可能是GCC中存在缺陷,或者标准未指定或未定义行为,您必须检查标准以查看其实际内容。FWIW,在我的VS2013上,我得到“致命错误C1001:编译器中出现内部错误。(编译器文件'f:\dd\vctools\compiler\cxxfe\sl\p1\c\p1_init.c',第3999行)”,内部编译器错误总是指向编译器中的错误,不管代码是否有效。我确实认为你关于MS有一个bug的结论是正确的,我只是认为你得出这个结论的理由是错误的。@BenVoigt我就是这么说的:“内部编译器错误总是指向编译器中的bug,不管代码是否有效。”
std::array<float, 3> a = {{1, 2, 3}};
std::array<std::array<float, 3>, 3> b = {{a, a, a}};

TMatrixNxM<float, 3, 3> mat(b);
TMatrixNxM<float, 3, 3> mat({{ {{1, 2, 3}}, {{4, 5, 6}}, {{7, 8, 9}}  }});