c2512 error: no hay un constructor predeterminado apropiado disponible

He encontrado el error “c2512” incluso si declaré el constructor. Mi código es así: en mi archivo “first.h”, lo declaré como:

class myClass { public: tmpM ( cv::Mat& _model ); } 

luego en mi “first.cpp” hice:

 #include "first.h" myClass::tmpM ( cv::Mat& _model ) { ... } 

Luego incluí este “first.h” en mi “second.h”, luego incluí este “second.h” en mi “third.h”, y llamé a esta clase en mi “third.cpp” de esta manera:

 cv::Mat myMat ( height, width, CV_8UC3 ); tmpM aM ( myMat ); 

Pero esto da un error c2512, diciendo

no hay un constructor por defecto apropiado

De hecho, busqué sobre esto y descubrí que debería construir un constructor predeterminado por mí mismo, y traté de hacerlo así en mi “first.h”:

 class myClass { public: tmpM ( cv::Mat& _model) {}; } 

Entonces se equivocó al decir:

La función “myClass :: tmpM” ya tiene un cuerpo

Intenté varios otros métodos para hacerlo pero todavía no pude resolverlo. No necesito construir un constructor por defecto aquí, pero me sigue molestando. ¿Alguien podría ayudarme?

Editar

Ok, después de tus sugerencias, lo cambié en este formulario:

 class myClass { public: myClass(cv::Mat& _model ) : tmpM (_model) { } private: cv::Mat& tmpM; }; 

Luego en mi “first.cpp”, recibí un error diciendo

statement es incompatible

¿Cómo podría resolverse esto?

El problema aquí parece ser que usted ha nombrado a su clase algo diferente a lo que ha nombrado su constructor. Tienen que tener el mismo nombre. Además, supongo que desea que el objeto retenga la referencia al modelo que está transmitiendo. Si desea conservarlo como una referencia, debe inicializarse en la lista de inicializadores de los constructores.

Usted quiere:

 class myClass { public: myClass(cv::Mat& _model ) : tmpM (_model) { } private: cv::Mat& tmpM; }; 

Debería ser:

 class myClass { public: myClass(cv::Mat& _model ) : tmpM (_model) { } }; 

Su versión declara una función (bueno, lo intenta, porque es una syntax no válida – falta el tipo de retorno) llamada tmpM , no inicializa al miembro.

Debe hacerlo como se indicó anteriormente porque el miembro del miembro de ese tipo no tiene un constructor predeterminado, por lo que debe inicializarlo en la lista de inicialización del constructor.

constructor por defecto es

 class myClass { public: myClass(); }