2015-06-01 10 views
0

Я пытаюсь создать классы шаблонов, где каждый может решить конкретный аспект проблемы, чтобы иметь возможность имитировать их, не прибегая к созданию традиционных абстрактных виртуальных классов. Для этого я считаю, что CRTP будет лучшей парадигмой. Однако при использовании CRTP немного больше я нашел в ловушке эту слабую логику разрешения - компилятор (g ++ 4.8.2) не может отличить два метода от разных классов, даже если их подпись отличается - только одно имя метода одинаково.Почему G ++ не может решить проблему этой очевидной легкой двусмысленности при попытке полиморфизма с помощью CRTP?

Реализация классов:

template< class T > 
class A { 
public: 
    void foo(uint32_t val) { 
     T* me = static_cast<T*>(this); 
     me->doit(); 
    } 
}; 

template< class T > 
class B { 
public: 
    void foo() { 
     uint32_t v32 = 10; 
     T* me = static_cast<T*>(this); 
     me->foo(v32); 
    } 
}; 

class Derived : public A<Derived>, 
       public B<Derived> 
{ 
public: 
    void doit() { 
     std::cout << "here" << std::endl; 
    } 
}; 

Затем он используется в качестве

Derived d; 
d.foo(); 

При компиляции, эта поверхность ошибок:

$ g++ -std=c++11 -c testLambda.cpp 

testLambda.cpp: In function ‘int main(int, char**)’: 
testLambda.cpp:102:7: error: request for member ‘foo’ is ambiguous 
d.foo(); 
^
testLambda.cpp:25:10: note: candidates are: void B<T>::foo() [with T = Derived] 
    void foo() { 
    ^
testLambda.cpp:16:10: note:     void A<T>::foo(uint32_t) [with T = Derived; uint32_t = unsigned int] 
    void foo(uint32_t val) { 

Является ли это ошибка компилятора или фактический ожидается результат?

+0

Пользователь [pubby8] (http://www.reddit.com/u/pubby8) на reddit.com/r/cpp [ответил] (http://www.reddit.com/r/cpp/comments/384j9g/why_g_cannot_resolve_the_scope_of_this_apparently/crs87nj) (цитата). Быстрое решение заключается в том, чтобы добавить это к Класс производного класса: с использованием A :: foo; с использованием B :: foo; –

ответ

0

Пользователь pubby8 на reddit.com/r/cpp responded (цитата) быстрое решение, чтобы добавить это производный своего класса тела:

using A<Derived>::foo; 

using B<Derived>::foo;