2017-10-29 13 views
1

次のコードの結果は、値テンプレートのコンパイルエラー - 型が明示的にスローに指定されている場合、コンパイラエラー「例外」内の

template <typename T> 
    class A { 
    public: 
     virtual ~A() = 0; 
     class Exception { 
     }; 
    }; 

    template<typename T> 
    inline A<T>::~A() {} 

    template <typename T> 
    class B : public A<T> { 
    public: 
     B() {} 

     ~B() {} 

     void foo() { 
      throw B<T>::Exception(); 
     } 
    }; 
    int main() 
    { 
     try { 
      B<int> instB = B<int>(); 
      instB.foo(); 
     } 
     catch(B<int>::Exception &e) { 
      std::cout << "uh oh" << std::endl; 
     } 
    } 

を参照しませんが、値を参照していない、それ働くテンプレートの種類を指定する際に問題があるようです。 Template compilation error: 'X' does not refer to a valueから

throw B<int>::Exception // this works 

これはその打ち鳴らすが値、ないタイプであることを「例外」を期待していることを示しています。

テンプレートクラスExceptionをスローする適切な方法は何ですか?

+1

'スロー型名B ::例外();'参照:https://stackoverflow.com/questions/610245/where-and-why-do-テンプレートと型名のキーワードを持つi-have-to-put-keywords –

+0

gcc上でコンパイラはコード自体を修正することができます:-): "note:say 'typename B :: Exceptionタイプは意味する "。 BTW:わかりやすくするために、A と書くべきです。そこに定義されているので... B はA から派生していますが、ちょっと変わっています... – Klaus

答えて

0

@Igor Tandetnikと@Klausで示されているように、コンパイラはそれを明確にするために型であることを伝える必要があります。

void foo() { throw typename B<T>::Exception() } 

またはより良い

void foo() { throw typename A<T>::Exception() } 
関連する問題