Предположим следующий пример
using namespace std;
template <template <typename> class>
struct X
{
X()
{
std::cout << "1";
}
};
template <typename>
struct Y {};
template <typename T>
using Z = Y<T>;
template <>
struct X<Y>
{
X()
{
std::cout << "2";
}
};
int main()
{
X<Y> x1;
X<Z> x2;
}
Выражение X<Y> x1
ясно, что используется специализация, которая печатает "2"
Второй странный. При анализе X<Z>
преобразуется в X< Y < T > >
. Я ожидаю напечатать «1». Но при запуске кода это печатает «2». Какое правило применяется во втором?
X< Y < T > >
, вы получили бы ошибку, потому чтоT
не определено (и еще одну ошибку, потому чтоY<T>
не является шаблоном (как того требуетX
), это класс). - person melpomene   schedule 22.08.2018