Явная специализация членов шаблонов классов

Пытаясь закрепить логику явной специализации членов шаблонов классов, я написал следующий код:

#include <iostream>
using namespace std;

template<class T> class X
{
    public:

    template<class U> class Y
    {
        public:
        template<class V> void f(U,V);
        void g(U);
    };
};

template<> template<> template<class V>
void X<int>::Y<int>::f(int, V) {}

int main() {
    X<int>::Y<int> b;
    b.f(1, 1);
}

Компилируется без проблем. Но когда я ввожу изменения, показанные ниже, он вообще отказывается компилировать:

#include <iostream>
using namespace std;

template<class T> class X
{
    public:

    template<class U> class Y
    {
        public:
        template<class V> void f(U,V);
        void g(U);
    };
};

template<> template<class U> template<class V>    // changes
void X<int>::Y<U>::f(U, V) {}               // changes

int main() {
    X<int>::Y<int> b;
    b.f(1, 1);
}

Ошибка:

1>d:\projects\ Programs\youtube\lesson\lesson\main.cpp(17): ошибка C3860: список аргументов шаблона после имени шаблона класса должен перечислять параметры в порядке, используемом в списке параметров шаблона 1>d:\projects\ Programs\youtube\lesson\lesson\main.cpp(17): ошибка C3855: "X": параметр шаблона "T" несовместим с объявлением

Может кто-нибудь объяснить мне, что здесь происходит? Спасибо!

0 ответов

Другие вопросы по тегам