以下模板专业化代码是非标准的还是VS-C++中的错误?

Sam*_*rsa 8 c++ templates visual-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;
}
Run Code Online (Sandbox Code Playgroud)

错误1错误C2039:'{ctor}':不是'Foo'main.cpp 25的成员

请注意,问题是Foo构造函数的外部定义.如果你在类中定义它,那么Visual-C++很高兴:

template <typename Policy>
struct Foo<Policy> {
  Foo() {}
};
Run Code Online (Sandbox Code Playgroud)

此外,以下代码在两者上编译(请注意||和缺少后的逻辑):

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;
}
Run Code Online (Sandbox Code Playgroud)

在信用到期的信用额度,这是DietmarKühl给我的略微修改版本)

Con*_*shi 0

在我看来,这与编译器的这个错误有关。