Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

[C++] Problem mit Templateüberladung

Diskussion: [C++] Problem mit Templateüberladung im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hi! Ich habe eine Templateklasse Matrix, die verschiedene Matrixoperationen implementiert. Unter anderem auch das Bestimmen der adjungierten Matrix. Da ...

Antwort
Alt 30.07.11, 15:28   #1 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard [C++] Problem mit Templateüberladung

Anzeige

Hi!

Ich habe eine Templateklasse Matrix, die verschiedene Matrixoperationen implementiert. Unter anderem auch das Bestimmen der adjungierten Matrix. Da sich die adjungierte für reele Matrizen anders bestimmen lässt, als für komplexe, benutze ich in der entsprechenden Methode der Matrixklasse eine global definierte Funktion, die der Benutzer dann für den von ihm verwendeten Typ selbst implementieren soll.
Zusätzlich stelle ich eine Standartimplementierung für die rudimentären PODs bereit. Diese habe ich als Templatefunktion implementiert und spezialisiere dieses Template über die boost Konstrukte enable_if und is_arithmetic soweit, dass es auch nur für diese Typen instantiiert werden kann.
Eine weitere Klasse leitet nun von einer konkreten Implementierung der Matrixklasse ab, sodass std::complex als Templateargument verwendet wird. Also muss ich hierfür eine eigene Implementierung meiner Hilfsfunktion bereitstellen und habe dafür die Templatefunktion für std::complex überschrieben.
Das ganze Konstrukt kompiliert unter VisualStudio 2008 einwandfrei. GCC 4.4.5 beschwert sich jedoch, dass keine für std::complex passende Funktion vorhanden sei. Grund hierfür ist wohl die Deklarationsreihenfolge. Die spezialisierte Funktion wird erst NACH dem Code deklariert, der sie aufruft. Normalerweise ein klarer Fall, aber der Compiler weiß doch erst bei der konkreten Verwendung der Matrixklasse, von welchem Typ das Templateargument ist und kann doch auch erst zu dem Zeitpunkt nach geeigneten Funktionen suchen, oder? Zu dem Zeitpunkt ist die überladende Funktion dann auch schon bekannt. Das ist dann vermutlich auch der Grund, warum es unter VC9 kompiliert?

Kann mir jemand sagen, welcher Compiler sich hier korrekt verhält?

Code   


Matrix.h
Code:
template<typename T>
typename boost::enable_if<boost::is_arithmetic<T>, T >::type
conjugate (const T & value) { return value; }

template<typename T>
class Matrix
{
public:

.
.
.

    const Matrix getAdjoint() const
    {
        Matrix result(this->m_columnCount, this->m_rowCount);

        for( size_t row=0; row<this->m_rowCount; ++row )
        {
            const std::vector<T> originalRow = (*this)[row];

            for( size_t column=0; column<this->m_columnCount; ++column)
            {
                result.SetElement( column, row, conjugate(originalRow[column]) );
            }
        }

        return result;
    }

.
.
.

};
ComplexMatrix.h
Code:
#include "Matrix.h"

inline const std::complex<double> conjugate (const std::complex<double> & value) { return conj(value); }

class ComplexMatrix: public Matrix< std::complex<double> >
{
.
.
.

void doStuff(); //hier wird getAdjoint() aufgerufen

.
.
.
};
__________________
A good programmer looks both ways before crossing a one-way street.

Die Politik kann uns nur für so dumm verkaufen, wie wir sind.
Thunderb0lt ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » [C++] Problem mit Templateüberladung
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61