我是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();
}
答案 0 :(得分:2)
您需要使用virtual_function_with_EnumInBase
对this
的来电加前缀,例如this->virtual_function_with_EnumInBase()
。
这是由于名称查找在模板中的工作原理。有关详细信息,请参阅Dependent names和Name Lookup, Templates, and Accessing Members of Base Classes。