我上课时使用了模板方法:
struct undefined {};
template<typename T> struct is_undefined : mpl::false_ {};
template<> struct is_undefined<undefined> : mpl::true_ {};
template<class C>
struct foo {
template<class F, class V>
typename boost::disable_if<is_undefined<C> >::type
apply(const F &f, const V &variables) {
}
template<class F, class V>
typename boost::enable_if<is_undefined<C> >::type
apply(const F &f, const V &variables) {
}
};
显然,两个模板都被实例化,导致编译时错误。 是否实例化模板方法不同于自由函数的实例化? 我已经解决了这个问题,但我想知道是什么。 我能想到的唯一可能导致这种行为,启用条件不依赖于立即模板参数,而是依赖于类模板参数
谢谢
答案 0 :(得分:12)
您的C
未参与apply
的扣除。有关代码失败原因的详细说明,请参阅this answer。
您可以这样解决:
template<class C>
struct foo {
template<class F, class V>
void apply(const F &f, const V &variables) {
apply<F, V, C>(f, variables);
}
private:
template<class F, class V, class C1>
typename boost::disable_if<is_undefined<C1> >::type
apply(const F &f, const V &variables) {
}
template<class F, class V, class C1>
typename boost::enable_if<is_undefined<C1> >::type
apply(const F &f, const V &variables) {
}
};