模板编译器错误 - 不引用值

时间:2017-10-29 18:47:18

标签: c++ c++11 templates

以下代码导致编译器错误'异常'不引用值

    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的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如@Igor Tandetnik和@Klaus所示,编译器需要被告知它是一种消除歧义的类型。

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

或更好

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