【发布时间】:2010-11-13 02:26:40
【问题描述】:
我有以下代码(抱歉,代码块很大,但我无法再缩小范围了)
template <bool B>
struct enable_if_c {
typedef void type;
};
template <>
struct enable_if_c<false> {};
template <class Cond>
struct enable_if : public enable_if_c<Cond::value> {};
template <typename X>
struct Base { enum { value = 1 }; };
template <typename X, typename Y=Base<X>, typename Z=void>
struct Foo;
template <typename X>
struct Foo<X, Base<X>, void> { enum { value = 0 }; };
template <typename X, typename Y>
struct Foo<X, Y, typename enable_if<Y>::type > { enum { value = 1 }; };
int main(int, char**) {
Foo<int> foo;
}
但是使用 gcc (v4.3) 编译失败
foo.cc: In function ‘int main(int, char**)’:
foo.cc:33: error: ambiguous class template instantiation for ‘struct Foo<int, Base<int>, void>’
foo.cc:24: error: candidates are: struct Foo<X, Base<X>, void>
foo.cc:27: error: struct Foo<X, Y, typename enable_if<Y>::type>
foo.cc:33: error: aggregate ‘Foo<int, Base<int>, void> foo’ has incomplete type and cannot be defined
好的,所以它是模棱两可的。但我没想到它会成为一个问题,因为在使用专业化时,它几乎总是会有些模棱两可。但是这个错误只有在使用enable_if<...>的类时才会触发,如果我用类似下面的类替换它就没有问题。
template <typename X, typename Y>
struct Foo<X, Y, void > { enum { value = 2 }; };
为什么这个类不会引起歧义,而其他类会?对于具有真正 ::value 的类来说,这两者不是一回事吗? 无论如何,感谢任何关于我做错了什么的提示。
感谢您的回答,我的真正问题(让编译器选择我的第一个专业化)已通过将 struct Foo<X, Base<X>, void> 替换为 struct Foo<X, Base<X>, typename enable_if< Base<X> >::type > 来解决,这似乎按我想要的方式工作。
【问题讨论】:
-
markdown 编辑器不是所见即所得的
-
我之前修复过,你覆盖了我的更改 :) 如果你愿意,你可以恢复到我的版本(我使用了“10101”按钮,它会自动将这些东西标记为代码,你应该使用它按钮)。
-
Uhjm...我又做了一次,没有阅读您的评论 litb
-
这是一个众所周知的事实,每个人都会等待 15 秒,看看是否有其他人会先重新格式化问题,然后他们都会同时进行类似但不相同的重新格式化,然后是一半的人假设他们可能做得更好,恢复到第一个编辑的版本......
标签: c++ templates gcc specialization