Augument Dependent Lookup不起作用

时间:2015-10-11 15:14:32

标签: c++ templates

我是C ++的初学者。我正在学习ADL(Augments Dependent Lookup)。 根据我的理解,ADL可以使用virtual_function_with_EnumInBase(B<T>::EnumInBase e)查找第(1)行的B<T>::EnumInBase。 但是gcc 4.9.2给了我错误信息:

  

virtual_function_with_EnumInBase未在此范围内声明,并且在实例化时,参数依赖查找未找到任何声明。

如果有人知道无法查找功能的原因或注意到我的误解,请告诉我。 非常感谢你。

template<typename T>
class B {
public:
    virtual ~B() = default;
    enum EnumInBase { e0 = 0, e1 = 1 };
    virtual void virtual_function_with_EnumInBase(EnumInBase e) {
        std::cout << "B::virtual_function_with_EnumInBase(EnumInBase e)" << std::endl;
    }
};

template<typename T>
class D : public B<T> {
public:
    virtual ~D() = default;
    void virtual_function_test(void) {
        typename B<T>::EnumInBase val_for_lookup = B<T>::e0;
        virtual_function_with_EnumInBase(val_for_lookup);  // line (1)
    }
};

void test(void) {
    D<double> a;
    a.virtual_function_test();
}

1 个答案:

答案 0 :(得分:2)

您需要使用virtual_function_with_EnumInBasethis的来电加前缀,例如this->virtual_function_with_EnumInBase()

这是由于名称查找在模板中的工作原理。有关详细信息,请参阅Dependent namesName Lookup, Templates, and Accessing Members of Base Classes