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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 5077
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
Schrompf
Moderator
Beiträge: 5077
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten