Seite 1 von 1

[C++] Adresse eines freien Template-Operators nehmen

Verfasst: 23.02.2017, 11:02
von Schrompf
Moin,

komisches Compilerproblem, an dem der GCC5.4 scheitert, aber Visual Studio seltsamerweise keinen Ärger macht. Es geht darum, meine Matheklassen-Operatoren dem AngelScript zu melden, damit ich Vektor/Matrix-Operationen im Skriptcode machen kann. Das minimale Beispiel sieht so aus:

Code: Alles auswählen

template<typename T>
struct Bla {
  friend Bla<T> operator - (const Bla<T> b) { return b; }
};

typedef Bla<float> BlaF;

int main(int argc, char ** argv) {
  auto f = static_cast<BlaF (*)(const BlaF&)> (operator - <float>)
}
Wie kriege ich dem Compiler beigebogen, dass ich den freien Operator '-' mit der Spezialisierung auf float brauche? Das hier ist übrigens eine reduzierte Version eines Makros, mit dem Angelscript sich dann den Funktionszeiger wegspeichert. Visual Studio scheint sogar ohne die <float>-Spezialisierung den richtigen Operator herauszufinden, aber mit Spezialisierung habe ich es noch nicht prüfen können.

Re: [C++] Adresse eines freien Template-Operators nehmen

Verfasst: 23.02.2017, 12:12
von dot
Schrompf hat geschrieben:[...] aber Visual Studio seltsamerweise keinen Ärger macht.
Das ist dann wohl ein Compilerbug in Visual Studio:
ISO/IEC 14882:2014 §14.6.5/2 hat geschrieben:As with non-template classes, the names of namespace-scope friend functions of a class template specialization
are not visible during an ordinary lookup unless explicitly declared at namespace scope (11.3).

ergo:

Code: Alles auswählen

template<typename T>
struct Bla
{
  friend Bla operator -(const Bla& b) { return b; }
};

using BlaF = Bla<float>;

template class Bla<float>;
BlaF operator -(const BlaF& b);

int main()
{
  auto f = static_cast<BlaF (*)(const BlaF&)>(&operator-);
}
;)

Edit: fixed Linker Error

Re: [C++] Adresse eines freien Template-Operators nehmen

Verfasst: 23.02.2017, 12:25
von Schrompf
Danke. Schrieb MasterQ auch schon im IRC. Wieder was gelernt. Die Lösung ist also das globale Erneut-Deklarieren wie in Deinem Code-Beispiel oder gleich das Rausbewegen als freie Funktion.