2017-12-17 21 views
1

派生クラスで戻り値の型として基本クラスのtypedefを使用しようとしています。派生クラスで基本クラスのtypedefを使用

template <typename T> 
class Base{ 
public: 
    typedef size_t size_type; 
    virtual size_type size() = 0; 
}; 

template <typename T> 
class Derived : public Base<T> { 
public: 
    using typename Base<T>::size_type; 
    virtual size_type size(); 
}; 

template <typename T> 
typename Derived<T>::size_type Derived<T>::size() { 
    return 1; 
} 

msvcはコードをコンパイルできません。コンパイラは「サイズの定義が宣言と一致しません」と述べています。

私は、コードを変更:

template <typename T> 
typename Base<T>::size_type Derived<T>::size() { 
    return 1; 
} 

状況は反対です。

私は、typename Base<T>::size_typeは、基本クラスで宣言された仮想関数も基本クラスのtypedefを使用しているので、もっと意味があると思います。しかし、clangは許されない。

クラスの定義を使用する必要がある場合、両方のコンパイラでコンパイルするようにコードを変更するにはどうすればよいですか?

+0

コンパイラのバージョンは?私はVS2017を持っており、問題なくコードをコンパイルします。 –

+0

@BoPerssonまたVS2017。私はエラーC2244を得た。 – CppLucifer

答えて

1

厳密に言えば、MSVCがそうでないときにClang(とGCC、btw)があなたのコードを受け入れるなら、それはあなたのコードに何か問題があるという兆候ではありません。 MSVCのテンプレートの実装は、長い間、非準拠でした。

しかし、私たちが現実世界に住んでおり、最適ではないツールで満足しなければならないことを認識して、使用宣言を取り除かなければならなくなります。この変更されたコードは、両方のコンパイラで受け入れられます:

#include <cstddef> 

template <typename T> 
class Base{ 
public: 
    typedef std::size_t size_type; 
    virtual size_type size() = 0; 
}; 

template <typename T> 
class Derived : public Base<T> { 
public: 
    virtual typename Base<T>::size_type size(); 
}; 

template <typename T> 
typename Base<T>::size_type Derived<T>::size() { 
    return 1; 
} 
+0

私は 'size_type = typename Base :: size_type;を使用して、あいまいな問題を解決しました。 – CppLucifer

関連する問題