Я боролся не с кодом 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 };
};
Могу поспорить, что это сработало бы, если бы это не была частичная специализация, но явные не могут быть в области имен. И я, очевидно, не могу специализировать шаблон внутри шаблона, не специализируя оба из них. Могу ли я?