Является ли следующий код специализации шаблона нестандартным или ошибкой в ​​VS-C++?

Следующий код компилируется в GCC (я использовал ideone, который использует gcc-4.3.4), но не не компилируется в Visual Studio. Является ли это стандартным кодом и ошибкой в ​​Visual C++ 2008 и 2010 (я пробовал в обоих) или нестандартным, и GCC с удовольствием его скомпилирует?

namespace cool
{
  template <bool, typename = void> struct enable_if {};
  template <typename T> struct enable_if<true, T> { typedef T type; };

  template <typename T0, typename T1> struct is_same { enum { value = false }; };
  template <typename T> struct is_same<T, T> { enum { value = true }; };
}

struct BasePolicy {};
struct BasePolicy2 {};
struct Faz {};

template <typename Policy,
typename = typename cool::enable_if<cool::is_same<BasePolicy, Policy>::value || cool::is_same<BasePolicy2, Policy>::value>::type >
struct Foo;

template <typename Policy>
struct Foo<Policy> {
  Foo();
};

template <typename Policy>
Foo<Policy>::Foo() {
}

int main()
{
  Foo<BasePolicy2> fb;
  // Foo<Faz> fb1;
}

Ошибка 1 error C2039: '{ctor}' : не является членом 'Foo' main.cpp 25

Обратите внимание, что проблема заключается в некорректном определении Foo' с конструктор. Если вы определите его в классе, тогда Visual-C++ будет доволен:

template <typename Policy>
struct Foo<Policy> {
  Foo() {}
};

Кроме того, следующий код компилируется на обоих (обратите внимание, что || и логика после него отсутствуют):

namespace cool
{
  template <bool, typename = void> struct enable_if {};
  template <typename T> struct enable_if<true, T> { typedef T type; };

  template <typename T0, typename T1> struct is_same { enum { value = false }; };
  template <typename T> struct is_same<T, T> { enum { value = true }; };
}

struct BasePolicy {};
struct BasePolicy2 {};
struct Faz {};

template <typename Policy,
  typename = typename cool::enable_if<cool::is_same<BasePolicy, Policy>::value>::type >
struct Foo;

template <typename Policy>
struct Foo<Policy> {
  Foo();
};

template <typename Policy>
Foo<Policy>::Foo() {
}

int main()
{
  Foo<BasePolicy> fb;
  // Foo<Faz> fb1;
}

Кредит, где кредит должен , это слегка измененная версия, предоставленная мне Дитмаром Кюлем)

8
задан Samaursa 12 March 2012 в 15:32
поделиться