以下代码导致编译器错误'异常'不引用值
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;
}
}
但是,如果将类型显式指定到throw中,则可以正常工作。在指定模板类型时似乎存在问题。
throw B<int>::Exception // this works
来自Template compilation error: 'X' does not refer to a value,这表明clang期待&#39;异常&#39;是一种价值,而不是一种类型。
抛出模板类Exception的正确方法是什么?
答案 0 :(得分:1)
如@Igor Tandetnik和@Klaus所示,编译器需要被告知它是一种消除歧义的类型。
void foo() { throw typename B<T>::Exception() }
或更好
void foo() { throw typename A<T>::Exception() }