2

クラステンプレートがあり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どちらの場合も、演算子が呼び出されなかったかのように、の無効な初期化のエラーが発生します。

4

1 に答える 1