2010-10-03 5 views
5

Je reçois pas de fonction membre correspondant à l'erreur lorsque je tente de compiler ce code sur mon compilateur mingw32aucune fonction correspondante dans la classe de modèle

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

Quelqu'un s'il vous plaît me dire comment résoudre le problème.

+2

correctement s'il vous plaît, utilisez le bouton 01010 sur le texte du code. –

Répondre

1

Vos copy c-tor et assignment operator [de Pattern class] prennent les paramètres comme référence non-const.

creator<double>() génère un temporaire (objet) et temporaires ne peuvent être liés à des références non-const. Donc, vous obtenez ces erreurs.

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

Essayez de passer les paramètres (de la copie c-tor et opérateur d'affectation) comme const références.

2

Modifier comme suit:

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

rvalues ​​(tels que ceux qui sont renvoyés par la fonction créateur instanciation) peut se lier uniquement à 'référence à const' en C++ 03.

BTW, quelque chose me donne un sentiment que vous attendiez la deuxième ligne dans votre principale pour appeler l'opérateur d'affectation. Ce n'est pas correct. Cette déclaration malgré ses apparences appelle le constructeur de copie pour créer 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."

le format
Questions connexes