C ++. Шаблон кандидата игнорируется - не удается сопоставить тип массива с самим собой - PullRequest
1 голос
/ 15 апреля 2019

Я написал шаблонную функцию, которая должна принимать ссылку на массив элементов 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"**.

Я почти уверен, что шаблон можно использовать для определения размера массива, как я пытаюсь сделать, но это не получается.

Это связано с тем, что я использую непримитивный тип?

Да, я знаю, что могу использовать вектор и вообще избежать этой проблемы. Но я действительно хочу знать, что, черт возьми, происходит, когда компилятор не может сопоставить тип с самой .

Что я могу сделать, чтобы избежать этого странного сообщения в будущем?

1 Ответ

4 голосов
/ 15 апреля 2019

Когда вы пишете это:

int n;
std::cin >> n;

Вы присваиваете значение n во время выполнения.

Однако аргументы шаблона должны быть известны в время компиляции . Это потому, что они нужны компилятору для генерации функции (которая затем будет скомпилирована и экспортирована в вашу библиотеку).

Синтаксис:

Node nodes[n];

называется Массив переменной длины , и это расширение компилятора. Это не переносимый C ++. Компилятор заставляет его выглядеть как обычный массив, но это не так.

Чтобы исправить вашу проблему, n должен быть известен во время компиляции:

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

Live Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...