Augument Dependent Lookup不起作用

Augument Dependent Lookup does not work

本文关键字:不起作用 Lookup Dependent Augument      更新时间:2023-10-16

我是一个c++初学者。我正在学习ADL(增强依赖查找)。在我的理解中,virtual_function_with_EnumInBase(B<T>::EnumInBase e)在(1)行可以用ADL用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();
}

您需要在呼叫virtual_function_with_EnumInBase前加上this,例如this->virtual_function_with_EnumInBase()

这是由于名称查找在模板中的工作方式。详细信息请参见依赖名称和名称查找、模板和访问基类的成员。