Kann jemand bitte, erklären 1), warum der folgende Code nicht auf Clang funktioniert und 2) wie sollte es neu geschrieben werden, kompatibel sein mit Clang ?Dynamische Verknüpfung nicht auf Clang für constexpr statisches Element von voll spezialisierten Vorlage
using LinkWeight = float;
template <bool WEIGHTED=true>
struct InpLink {
using Weight = LinkWeight; //!< \copydoc LinkWeight
Weight weight; //!< Link weight
// ...
};
template <>
struct InpLink<false> {
using Weight = LinkWeight; //!< \copydoc LinkWeight
constexpr static Weight weight = 1;
};
Dieser Code funktioniert auf GCC in Ordnung, hat aber den Verknüpfungsfehler auf Clang 3.8.1 auf Linux Ubuntu x64:
undefined reference to `InpLink :: weight‘
nach der Definition:
template <>
constexpr typename InpLink<false>::Weight InpLink<false>::weight;
die Fehler bei der Kompilierung ist: extraneous 'template<>' in declaration of variable 'weight'
Nach der Definition:
template <bool WEIGHTED>
constexpr typename InpLink<false>::Weight InpLink<false>::weight;
die Kompilierung Fehler ist:
..cluster.hpp:31:60: error: redefinition of 'weight' as different kind of symbol
constexpr typename InpLink<false>::Weight InpLink<false>::weight;
^
..cluster.h:58:27: note: previous definition is here
constexpr static Weight weight = 1;
, die wie ein Klirren Bug sieht ...
HINWEIS: Das gleiche Beispiel funktioniert gut auf CLang, wenn ich 2 Parameter in der Vorlage habe, partielle Spezialisierung durchführen und das statische consExpr-Gewicht wie folgt definieren:
template <bool TMP>
constexpr typename InpLink<false, TMP>::Weight InpLink<false, UNSIGNED>::weight;
Mit
template <bool WEIGHTED=true, bool TMP=true>
struct InpLink {
using Weight = LinkWeight; //!< \copydoc LinkWeight
Weight weight; //!< Link weight
// ...
};
template <bool TMP>
struct InpLink<false, TMP> {
using Weight = LinkWeight; //!< \copydoc LinkWeight
constexpr static Weight weight = 1;
};
Offensichtlich Ich möchte keine zusätzlichen Template-Parameter verwenden, um die Verknüpfung Fehler zu überwinden. Gibt es einen anderen Weg, dies zu lösen?
Was ist los mit CLang 3.8.1 oder mit meiner vollständigen Template-Spezialisierung?