C++ C++;。已忽略候选模板-无法';不能将数组类型与自身匹配

C++ C++;。已忽略候选模板-无法';不能将数组类型与自身匹配,c++,templates,C++,Templates,我编写了一个模板函数,它应该引用具有一定大小的常量元素数组。但是由于某种原因,当我调用它时,编译器说这个函数不匹配 #include<iostream> struct Node { int key, left, right; }; template <int N> bool isCorrect(const Node (&nodes)[N]) { // doesn't matter return true; } int main ()

我编写了一个模板函数,它应该引用具有一定大小的常量元素数组。但是由于某种原因,当我调用它时,编译器说这个函数不匹配

#include<iostream>

struct Node
{
    int key, left, right;
};

template <int N>
bool isCorrect(const Node (&nodes)[N])
{
    // doesn't matter
    return true;
}

int main ()
{
    int n;
    std::cin >> n;
    Node nodes[n];
    std::cout << (isCorrect(nodes) ? "CORRECT" : "iNCORRECT") << '\n';

    return 0;
}
#包括
结构体类型
{
int键,左,右;
};
模板
bool isCorrect(常量节点和节点)[N])
{
//没关系
返回true;
}
int main()
{
int n;
标准:cin>>n;
节点[n];
std::cout当你写这篇文章时:

int n;
std::cin >> n;
您正在运行时为
n
赋值

但是,模板参数必须在编译时已知。这是因为编译器需要它们来生成函数(然后编译并导出到库中)

语法:

Node nodes[n];
被称为A,它是编译器扩展。它不是可移植的C++。编译器使它看起来像一个规则数组,但不是。

要解决问题,必须在编译时知道
n

constexpr int n = 1;
Node nodes[n];
std::cout << (isCorrect(nodes) ? "CORRECT" : "iNCORRECT") << '\n';
constexpr int n=1;
节点[n];
std::cout当你写这篇文章时:

int n;
std::cin >> n;
您正在运行时为
n
赋值

但是,模板参数必须在编译时已知。这是因为编译器需要它们来生成函数(然后编译并导出到库中)

语法:

Node nodes[n];
被称为A,它是编译器扩展。它不是可移植的C++。编译器使它看起来像一个规则数组,但不是。

要解决问题,必须在编译时知道
n

constexpr int n = 1;
Node nodes[n];
std::cout << (isCorrect(nodes) ? "CORRECT" : "iNCORRECT") << '\n';
constexpr int n=1;
节点[n];

STD:可能是A?特别是对VLA在类型系统上的含义的评论。<代码>节点[n];< /> >不是有效的C++。<代码>节点节点[n]如果不是你的话,C++代码就不是合法的C++代码。打开代码< >代码> >代码,如果你需要运行时大小的数组,使用一个“代码”>:STD::向量< /代码>可能是一个。特别是对VLA在类型系统上的含义的评论。<代码>节点[n];< /> >无效c++。<代码>节点节点[n]不是合法的C++代码。打开代码> -PoANDICTIC/<代码>,您将得到警告/错误。如果需要运行时大小的数组,请使用<代码> STD::vector < /代码>