我有一个类模板CFoo<T>
。我想允许隐式转换到 的其他实例CFoo
,但仅适用于模板参数是T
.
我尝试使用 SFINAE,但我的任何尝试都不适用于我尝试过的任何编译器(VC 2012 或 gcc):
#include <type_traits>
template <class T> class CFoo {
public:
template <class Q> operator
// typename std::enable_if<std::is_base_of<Q, T>::value, CFoo<Q>&>::type // SHOULD WORK?
// typename std::enable_if<1, CFoo<Q>&>::type // SHOULD WORK?
CFoo<Q>& // compiles, but doesn't restrict on Q like I want
() const {
return *(CFoo<Q>*)this;
}
};
class A {};
class B : public A {};
int main(int argc, char* argv[])
{
CFoo<B> b;
CFoo<A>& a = b;
return 0;
}
为什么在 SFINAE 中被注释掉的任何一个尝试都不在这里工作?在这两种情况下,我都会收到一个无效初始化的错误a
,就好像我的操作员没有被调用一样。