Следующий код компилируется в 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;
}
Кредит, где кредит должен , это слегка измененная версия, предоставленная мне Дитмаром Кюлем)