Вы пересекаете потоки. Разве вы не видели охотников за привидениями? Не пересекайте потоки.
Вы пересекаете потоки здесь:
class B : public A < B *>
Я не понимаю смысла этого. Что ты пытаешься сделать? CRTP? Это не так, как это делается.
Проблема не в возврате, проблема в том, что "this" неверно.
Когда у вас есть
void f()
{
cache_page cpage;
}
Он скомпилирован в NOP. это не принято все нормально.
void f()
{
cache_page cpage;
// oops this access
this->cachedPages.push_back(cpage);
}
За исключением того, что это называется в контексте А. Какова ценность этого? Это нигде не инициализировано. Так что это равно тому, что находится в памяти, где ждет счастливый неинициализированный список.
Исправление?
template < class T >
class A
{
T * _x;
public:
explicit A(T * x) : _x(x) {}
void func()
{
_x->f();
}
};
class B : public A < B >
{
list<cache_page> cachedPages;
public:
B(void) : A<B>(this) {}
void f()
{
cache_page cpage;
cachedPages.push_back(cpage);
}
};
Это должно работать лучше. Но как насчет ...
template < class T >
class A
{
public:
void func()
{
static_cast<T>(this)->f();
}
};
class B : public A<B>
{
list<cache_page> cachedPages;
public:
void f()
{
cache_page cpage;
cachedPages.push_back(cpage);
}
};
Вот так и делается CRTP.