Условие типа в задаче класса шаблона C ++ - PullRequest
4 голосов
/ 22 августа 2010

Использование GCC 4.2. У меня есть эта метатемплата для условного типа:

template <bool condition, typename Then, typename Else>
struct IF
{
    typedef Then RET;
};

template <class Then, class Else>
struct IF<false, Then, Else>
{
    typedef Else RET;
};

и когда я использую это так:

template <typename T>
class Param
{
    IF< sizeof(int)<sizeof(long), long, int>::RET  i;
};

это работает, но когда я использую это так (пытаясь использовать параметры шаблона):

template <typename T>
class Param
{
    IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam;
};

Я получаю этот код ошибки:

error: type 'IF<false, T&, T*>' is not derived from type 'Param<T>'

Почему это происходит? Как это решить? Заранее спасибо!

1 Ответ

8 голосов
/ 22 августа 2010

Во втором случае значение RET зависит от типа шаблона T. Компилятор должен быть уверен, что он будет типом во всех возможных экземплярах (и, возможно, не статическим членом некоторой реализации IF). Вы делаете это с ключевым словом typename.

template <typename T>
class Param
{
    typename IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam;

};
...