2010-10-03 17 views
5

ottengo nessun errore funzione membro corrispondenza quando provo a compilare il codice sul mio compilatore mingw32alcuna funzione corrispondente nella classe template

#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>(); 
} 

Qualcuno per favore mi dica come risolvere il problema.

+2

formato corretto, utilizzare il tasto 01010 sul testo del codice. –

risposta

1

tuo copy c-tor e assignment operator [di Pattern classe] prende come parametri di riferimento non-const.

creator<double>() genera una temporanea (oggetto) e provvisori, non può essere associato a riferimenti non-const. Così si ottiene quegli errori.

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

Prova a passare i parametri (di copy c-tor e assegnazione), come const riferimenti.

2

Modifica come segue:

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

rvalues ​​(come quelli restituiti dalla funzione creatore esemplificazione) può legarsi solo a 'riferimento a const' in C++ 03.

BTW, qualcosa mi dà la sensazione che vi aspettavate la seconda linea nel vostro principale per richiamare l'operatore di assegnazione. Questo non è corretto. Questa affermazione Nonostante la sua apparenza invoca il costruttore di copia per creare pt2.

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

Problemi correlati