2010-10-03 8 views
5

ich keine passende Elementfunktion Fehler, wenn ich versuche, diesen Code auf meinem mingw32 Compiler sagen Sie mirkeine passende Funktion in Template-Klasse

#include <iostream> 
using std::cout; 
template <class T> 
class Pattern 
{ 
public: 
    Pattern(): element(){ 

     cout<< "default c-tor"; 
     } 

    Pattern(Pattern &copy): element(copy.element){ 

     cout<< "copy c-tor"; 

     } 

    Pattern& operator=(Pattern &assgn) 
    { 
     cout<<" assignment operator"; 
     element = assgn.element; 
     return *this; 
    } 

    ~Pattern(){ 

     cout<<"destructor"; 

     } 

private: 
    T element; 
}; 

template <class T> 
Pattern<T> creator() 
{ 
    cout<< "Testing creator"; 
    Pattern<T> pat; 
    return pat; 
} 

int main() 
{ 
    Pattern<double> pt1(creator<double>()); 
    Pattern<double> pt2 = creator<double>(); 
} 

Jemand bitte zu kompilieren, wie das Problem zu lösen.

+2

Format richtig Bitte verwenden Sie die 01010-Taste auf dem Codetext. –

Antwort

1

Ihre copy c-tor und assignment operator [von Pattern Klasse] nimmt Parameter wie non-const Bezug.

creator<double>() erzeugt ein temporäres (Objekt) und Provisorien können nicht an nicht-konstante Referenzen gebunden werden. So bekommst du diese Fehler.

ISO C++ 03 [8.5.3/5]

Otherwise, the reference shall be to a non-volatile const type (i.e., cv1 shall be const).
[Example:

double& rd2 = 2.0; //error: not an lvalue and reference not const

versuchen, die Übergabe von Parametern (Kopier c-tor und Zuweisungsoperator) als const Referenzen.

2

wie folgt ändern:

Pattern(Pattern const &copy): element(copy.element){ 

Rvalues ​​(wie jene von Creator Funktion Instanziierung zurückgegeben) kann nur auf 'Verweis auf const' binden, in C++ 03.

BTW, etwas gibt mir ein Gefühl, dass Sie die zweite Zeile in Ihrem Haupt erwartet, um den Zuweisungsoperator aufzurufen. Das ist nicht richtig. Diese Anweisung ruft trotz ihres Aussehens den Kopierkonstruktor auf, um pt2 zu erzeugen.

EDIT 2:

$8.5/14- "The initialization that occurs in the form

T x = a;

as well as in argument passing, function return, throwing an exception (15.1), handling an exception (15.3), and aggregate member initialization (8.5.1) is called copy-initialization."

Verwandte Themen