2015-10-11 4 views
0

Я новичок C++. Я изучаю ADL (Augens Dependent Lookup). В моем понимании, virtual_function_with_EnumInBase(B<T>::EnumInBase e) в строке (1) можно найти в ADL с помощью B<T>::EnumInBase. Однако GCC 4.9.2 дает мне сообщение об ошибке:Augument Dependent Lookup не работает

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(); 
} 

ответ

3

Вам необходимо префикс вызова virtual_function_with_EnumInBase с this, например this->virtual_function_with_EnumInBase().

Это связано с тем, как поиск имени работает в шаблонах. См. Dependent names и Name Lookup, Templates, and Accessing Members of Base Classes для получения более подробной информации.

+0

Спасибо Максим Егорушкин. Я прочитаю рекомендованный вами сайт. – mora