Шаблонная специализация шаблонного типа не выбирается при использовании нескольких типов имен - PullRequest
0 голосов
/ 06 января 2011

Допустим, у меня есть

template <typename T>
class F;

. Я могу создать другой шаблон, который принимает F в качестве типа, с настройками по умолчанию и специализацией.G<F<int> > g_of_f.Компилятор правильно выбирает специализацию G, и все отлично.

Так что вот моя проблема.Я хочу сделать это с более чем одним типом шаблона в списке.Но когда я пытаюсь

template <typename U, typename S>
class H;

template <typename U>
template <typename T>
class H <U, F<T> >
{
};

, теперь не могу создать экземпляр H<void, F<int> > h_of_f, потому что компилятор выбирает оригинальный шаблон H, а не специализацию.

Я наблюдал то жес g ++ 4.1 и g ++ 4.4.

Какая разница между G и H, которая мешает компилятору работать так, как я ожидаю?

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Синтаксис template<> используется для представления явного объявления специализации, здесь у вас есть частичное специализации:

template <typename S>
class G;

template <typename S>
class G < F<S> >
{
};

template <typename U, typename S>
class H;

template <typename U, typename S>
class H <U, F<S> >
{
};
1 голос
/ 06 января 2011
template <typename U, typename S>
class H;

template <typename U, typename T>
class H <U, F<T> > {};

Этот синтаксис:

template <> template <typename U>

предназначен для специализации / определения членов шаблона вне шаблона: http://www.comeaucomputing.com/techtalk/templates/#outsidedef

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