我写了一个模板函数,该函数应该引用具有一定大小的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并完全避免此问题。 但是我真的很想知道当编译器无法将类型与自身相匹配时,到底发生了什么。
为了避免日后出现这种奇怪的消息,我该怎么做?
答案 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';