Я пытаюсь создать классы шаблонов, где каждый может решить конкретный аспект проблемы, чтобы иметь возможность имитировать их, не прибегая к созданию традиционных абстрактных виртуальных классов. Для этого я считаю, что 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) {
Является ли это ошибка компилятора или фактический ожидается результат?
Пользователь [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; –