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をスローする適切な方法は何ですか?
'スロー型名B ::例外();'参照:https://stackoverflow.com/questions/610245/where-and-why-do-テンプレートと型名のキーワードを持つi-have-to-put-keywords –
gcc上でコンパイラはコード自体を修正することができます:-): "note:say 'typename B :: Exceptionタイプは意味する "。 BTW:わかりやすくするために、A と書くべきです。そこに定義されているので... B はA から派生していますが、ちょっと変わっています... –
Klaus