Код не завершен, добавьте #include и "using namespace std;". Что еще более важно, вы получаете желаемое поведение, удаляя объявление виртуальной функции в A.
В общем, основная причина использования CRTP - сообщить шаблону тип, который он получает, и избегать виртуального вызова (или, лучше, избегать превращения метода в виртуальный).
template <typename T>
class ClassUsingSomething {
public:
void method1() {
// I need to call method2, I do this by casting, so it doesn't need to be virtual.
static_cast<T *>(this)->method2();
}
};
class A: public ClassUsingSomething<A> {
public:
void method2() {
//do something
}
};