【发布时间】:2012-03-29 00:23:32
【问题描述】:
以下代码在 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 错误 C2039: '{ctor}' : is not a member of '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;
}
信用到期,这是 Dietmar Kühl 给我的稍微修改过的版本)
【问题讨论】:
-
Visual Studio 给您带来的实际错误是什么?
-
@James:在问题中添加了错误
-
也许您应该链接到 Dietmar 建议该方法的原始问题。此外,在他的答案中添加评论并附上此问题的链接可能会引起他的注意。我确信他知道这个问题的答案。
-
嘿,我做的第一件事是在 connect.microsoft.com 中搜索该错误号并查看您的帖子。 :)
-
@DavidRodriguez-dribeas:比这要复杂一些。他在单独的讨论中展示了这段代码,我在其中遇到了外联定义的语法问题。后来我添加了额外的部分(|| 和它之后的部分),它没有在 VC++ 中编译但在 gcc 上编译(他尝试了除 VC++ 之外的所有编译器,我相信他在 iOS 上)因此这个问题。
标签: c++ templates visual-c++