Не решение вашей проблемы (есть пара уже там), но некоторые вещи, которые ошибочны в вашем коде:
Вам не хватает ключевого слова struct
или class
вобъявление класса шаблона:
template <typename A, typename B> struct do_something_implementation {
// ^^^^^^
Внутри определения класса функции-члены не должны использовать квалифицированное имя, независимо от того, является ли класс шаблоном или нет:
class A {
void A::foo() {} // Error, should be: void foo() {}
};
Специализации шаблона членане может появляться внутри определения класса, но на уровне пространства имен:
class B {
template <typename T> void foo( T );
};
template <> void B::foo<int>( int ) {}
template <> void B::foo<double>( double ) {}
Кроме того, в вашем случае функция-член - это не шаблон, а скорее функция-член без шаблонов (шаблон - это содержащий класс, а не сама функция).То, что ваш код фактически пытается сделать, - это определить функции-члены других классов внутри общего шаблона, что-то вроде попытки сделать.
В целом было достаточно ошибок, чтобы сделать синтаксический анализ кода практически невозможным для компилятора, чтобы определить, чтовы пытались сделать и выдать хорошее сообщение об ошибке, но, тем не менее, оно должно было предоставить любое сообщение об ошибке, указывающее на первую строку, которую вы скопировали, вместо того, чтобы задыхаться до смерти.