C ++。候选模板被忽略-无法将数组类型与其自身匹配

时间:2019-04-15 17:57:40

标签: c++ templates

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

#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;
}

它给了我一个我无法解读的相当神秘的错误信息:

"candidate template ignored couldn't match **Node** against **Node"**.

我很确定可以像我正在尝试的那样使用模板来确定数组大小,但这失败了。

这是由于我使用了非原始类型吗?

是的,我知道我可以使用vector并完全避免此问题。 但是我真的很想知道当编译器无法将类型与自身相匹配时,到底发生了什么。

为了避免日后出现这种奇怪的消息,我该怎么做?

1 个答案:

答案 0 :(得分:4)

当您写这篇文章时:

int n;
std::cin >> n;

您正在在运行时为n分配一个值。

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

语法:

Node nodes[n];

被称为Variable Length Array,它是编译器扩展。它不是可移植的C ++。编译器使它看起来像常规数组,但不是。

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

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

Live Demo