Помогите мне с «параметрами шаблона, не используемыми при частичной специализации» - PullRequest
1 голос
/ 18 июня 2011

Я боролся не с кодом C ++ 0x, а с обычным C ++. Не спрашивайте меня, почему я должен использовать обычный C ++, это просто какое-то глупое требование.

Так вот в чем дело: мне нужно получить значение в перечислении равным 1 или 0, учитывая, что какое-то утверждение является истинным или ложным. Поэтому, конечно, я шаблонизировал структуру, содержащую 0 в перечислении, специализировал ее вторым оператором, в котором перечисление содержит 1 вместо 0.

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

Вот код:

  template<typename T>
  struct CanPrint
  {
    template<size_t>
    struct Value               { enum { val = 0 }; };

    template<size_t>
    struct Value<sizeof(True)> { enum { val = 1 }; };

    enum
    { value = Value<sizeof(IsTrue<T>(0))>::val };
  };

Могу поспорить, что это сработало бы, если бы это не была частичная специализация, но явные не могут быть в области имен. И я, очевидно, не могу специализировать шаблон внутри шаблона, не специализируя оба из них. Могу ли я?

Ответы [ 2 ]

3 голосов
/ 18 июня 2011
template<>  //<---- leave it empty
struct Value<sizeof(True)> { enum { val = 1 };

Кстати, это не частичная специализация, если True не является аргументом шаблона.Это полная специализация.

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

Или вы можете сделать это вместо этого:

template<typename T>
struct CanPrint
{
    //modified
    template<typename U, size_t N = sizeof(U)> 
    struct Value { enum { val = 0 }; };

    //modified - now its partial specialization
    template<typename U>    
    struct Value<U, sizeof(True)> { enum { val = 1 }; };

    enum { value = Value<IsTrue<T> >::val }; //modified here as well
};

См. Онлайн-демонстрацию: http://www.ideone.com/MSG5X

2 голосов
/ 18 июня 2011
template<> // note the empty <>
struct Value<sizeof(True)> { enum { val = 1 }; };

Вы перечисляете параметры только для частичных специализаций:

template< typename T, typename U> 
struct X;

template<typename U> 
struct X<char,U> {...};

template<typename Z, typename U> 
struct X<std::vector<Z>, U> {...};

Не для полных специализаций:

template<> 
struct X<double,int> {...};
...