Потому что это не шаблонная специализация написанной вами функции-члена.Это специализация класса.Следовательно, код должен выглядеть следующим образом (я добавил общий базовый класс, который не должен определять члены для всех спецификаций):
template <typename T, typename U>
class BankAccountBase
{
protected:
T money;
U interestRate;
public:
BankAccountBase(T money, U interestRate) :
money(money), interestRate(interestRate)
{}
};
template <typename T, typename U>
class BankAccount
{
T money;
U interestRate;
public:
BankAccount(T money, U interestRate) :
money(money), interestRate(interestRate)
{}
void showMeTheMoney();
};
template <typename U>
class BankAccount <int, U> : public BankAccountBase <int, U>
{
public:
BankAccount(int money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
template <typename U>
class BankAccount <long, U> : public BankAccountBase <long, U>
{
public:
BankAccount(long money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
template <typename U>
class BankAccount <float, U> : public BankAccountBase <float, U>
{
BankAccount(float money, U interestRate) :BankAccountBase(money, interestRate) { }
public:
void showMeTheMoney();
};
template <typename U>
class BankAccount <double, U> : public BankAccountBase <double, U>
{
public:
BankAccount(double money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
template <typename U>
class BankAccount <long long, U> : public BankAccountBase <long long, U>
{
public:
BankAccount(long long money, U interestRate) :BankAccountBase(money, interestRate) { }
void showMeTheMoney();
};
// invalid code
template <typename U>
void BankAccount <int, U>::showMeTheMoney()
{
printf("$%d.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <long, U>::showMeTheMoney()
{
printf("$%l.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <long long, U>::showMeTheMoney()
{
printf("$%l.00 interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <float, U>::showMeTheMoney()
{
printf("$%.2f interest: %f\n", money, interestRate);
}
template <typename U>
void BankAccount <double, U>::showMeTheMoney()
{
printf("$%.2f interest: %f\n", money, interestRate);
}
int main(int argc, char *argv[])
{
BankAccount<double, float> b(500, 0.03);
b.showMeTheMoney();
BankAccount<long long, float> c(1234, 0.01);
c.showMeTheMoney();
}