C ++ 17 Стандартные аргументы шаблона: недопустимое использование имени шаблона без списка аргументов - PullRequest
6 голосов
/ 14 января 2020

С C ++ 17 вы можете сделать вывод аргумента шаблона класса в main, как в следующем примере:

template<class T = int>
struct X{};

int main()
{
    X myX;
}

Почему вычет аргумента шаблона не разрешен для членов данных?

template<class T = int>
struct X{};

struct Y
{
   X myX;
};

int main()
{
   Y myY;
}

ошибка: недопустимое использование имени шаблона 'X' без списка аргументов X myX;

1 Ответ

7 голосов
/ 14 января 2020

Я не был вовлечен в решение, однако, я вижу некоторые проблемы в его принятии. Давайте предположим следующий код:

template<class T = int>
struct X
{
    X(T t = T{}) {}
};

Это делает вашу переменную все еще в порядке:

int main()
{
     Y myY;
}

Однако, что если Y имеет конструктор, который реализован в отдельном файле?

struct Y
{
    Y();
    X myX{'a'};
};

Y::Y() : myX{0.0} {}

Можем ли мы в этом случае myX быть X<int> или X<double> или X<char>?

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

...