Проблема заключается в том, что вы пытаетесь определить тест функции вне определения класса класса B. Сначала вы должны объявить его в классе
template <int dim> class B : public A <dim> { double test() const; };