Почему Visual Studio позволяет мне использовать закрытые члены в функции шаблона (C ++)? - PullRequest
1 голос
/ 08 октября 2019

Я немного смущен странным поведением Visual Studio.

class Test
{
private:
    int x;
};

void func()
{
    Test t;
    t.x; // VS shows error here
}

Синтаксическая ошибка

Этот код не компилируется, потому что я пытаюсьдля доступа к приватному члену x

Но в случае функции шаблона VS говорит, что все в порядке, и позволяет мне получить доступ к x

class Test
{
private:
    int x;
};

template <class T>
void func()
{
    Test t;
    t.x; // No error
}

Нет ошибок с шаблономfunction

VS показывает мне приватные поля

Если я вызову эту шаблонную функцию, результатом будет ошибка времени компиляции, и я понимаю, почему. Но я не могу понять, почему VS не показывает мне ошибку в окне редактора. Есть случай, когда эта функция будет работать? Или это просто ошибка в редакторе VS?

1 Ответ

1 голос
/ 08 октября 2019

Функция шаблона не является функцией до тех пор, пока не будет создан экземпляр шаблона (это шаблон для создания функций).

Чтобы сгенерировать ошибку, VS всегда сообщает вам, каковы фактические параметры шаблона. Поскольку вы не создаете его ни для чего, пока нет способа создать это сообщение об ошибке (хотя технические причины могут быть другими). ​​

Как только вы начнете использовать шаблон для чего-то, вы должны получить ошибку компиляции.

Это специфично для Visual Studio. Другие компиляторы выдают здесь правильную ошибку, поскольку Test::x не является зависимым именем. Это известная слабая область, в которой улучшается Visual Studio.

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