[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.

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

Beitragvon Schrompf » 23.02.2017, 12:02

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: Ansicht erweitern :: 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.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3608
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

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

Beitragvon dot » 23.02.2017, 13:12

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: Ansicht erweitern :: 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
dot
Michael Kenzel
 
Beiträge: 1587
Registriert: 06.03.2004, 19:10

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

Beitragvon Schrompf » 23.02.2017, 13:25

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.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3608
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu


Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 3 Gäste

cron