Specjalizacja szablonów członków klasy bez deklaracji w nagłówku

Mam klasę szablonu, którą deklaruję w nagłówku za pomocą jednej metody i bez definicji tej metody w nagłówku. W pliku .cc definiuję specjalizacje tej metodybez deklarowania ich w nagłówku. W innym pliku .cc wywołuję metodę dla różnych parametrów szablonu, dla których istnieją specjalizacje. To wygląda tak:

foo.h:

template<typename T>
class Foo {
public:
  static int bar();
};

foo.cc:

#include "foo.h"

template<>
int Foo<int>::bar() {
  return 1;
}

template<>
int Foo<double>::bar() {
  return 2;
}

main.cc:

#include <iostream>
#include "foo.h"

int main(int argc, char **argv) {
  std::cout << Foo<int>::bar() << std::endl;
  std::cout << Foo<double>::bar() << std::endl;
  return 0;
}

Ten program kompiluje się i łączy z gcc 4.7.2 dla wszystkich standardów C ++ (c ++ 98, gnu ++ 98, c ++ 11 i gnu ++ 11). Dane wyjściowe to:

1
2

To ma dla mnie sens. Ponieważ jednostka tłumacząca main.cc nie widzi definicjibar() lub jakiejkolwiek specjalizacji tego, oczekuje połączeń dobar() używać jawnych instancji nie wyspecjalizowanej definicjibar() w innej jednostce tłumaczeniowej. Ponieważ jednak zniekształcanie nazw jest przewidywalne, specjalizacje w foo.cc mają takie same nazwy symboli, jak jawne instancje nie wyspecjalizowanej definicji, więc main.cc może używać tych specjalizacji bez ich deklarowania w tej jednostce tłumaczeniowej.

Moje pytanie brzmi: czy jest to wypadek, czy też jest to zachowanie zalecane przez standard C ++? Innymi słowy, czy ten kod jest przenośny?

Najważniejszym pytaniem, jakie mogłem znaleźć, jest pytanieDeklaracja specjalizacji członka klasy szablonu, ale nie obejmuje tego konkretnego przypadku.

(W przypadku, gdy zastanawiasz się, dlaczego to ma dla mnie znaczenie, to dlatego, że używam kodu takiego jak ten, który jest rodzajem tabeli wyszukiwania w czasie kompilacji i jest dużo krótszy, jeśli nie deklaruję specjalizacji).

questionAnswers(1)

yourAnswerToTheQuestion