Weil der Compiler beim Parsen (was ja VOR dem Einsetzen von Argumenten
passiert - außer bei MSVC!) nicht genau weiß was "cm_" ist, weiß er auch
nicht dass "create" ein template ist. Er nimmt an, create ist eine
normale Member-Variable, und parst das "cm_.create < CallbackMethod" als
kleiner-Operator. Das geht natürlich schief.
Lösen lässt sich das indem man
1 | cm_.template create<CallbackMethod, A::Change_callback>();
|
schreibt. Dies zeigt dem Compiler an, dass "create" ein template ist,
und nach dem "<" template-Argumente kommen.
Dass der MSVC das ohne "template" durchgehen lässt, ist nicht
standard-konform, der Standard erfordert das "template". Beim MSVC geht
es deswegen, weil er templates erst dann parst, wenn sie eingesetzt
werden. Dadurch fallen einige Fehler nicht oder erst später auf, und
andere korrekte Dinge funktionieren nicht. Bei MS ist halt alles immer
etwas speziell :)