C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

VC++6: method virtuelle de class parent non accessible.

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
fpicca at ltpcm inpg fr
Guest





PostPosted: Tue Apr 25, 2006 2:06 pm    Post subject: VC++6: method virtuelle de class parent non accessible. Reply with quote



Bonjour

je ne mets pas les constructeurs et destructeurs.

namespace toto {
class Parent
{
public:
virtual void method(void);
}
namespace titi {
class Fille : public Parent
{
public
virtual void method(void);
}
}

lorsque j'implémente la classe fille:
void Fille::method(void)
{
typedef toto::Parent ParentName;
ParentName::method(void);
}

Je suis obligé de passer par un typedef du fait d'un bug de VC++6 qui
ne reconnait pas l'écriture
toto::Parent::method();

Le problème est que lors de l'execution de Fille::method(), la
méthode parent n'est pas appelèe mais c'est elle même qui s'appèle
de façon récursive.
Fille -> Fille -> Fille ...
à la place de
Fille -> Parent

Qu'es-je donc fais de mal ? Wink
Back to top
Aurelien Regat-Barrel
Guest





PostPosted: Tue Apr 25, 2006 3:06 pm    Post subject: Re: VC++6: method virtuelle de class parent non accessible. Reply with quote



fpicca at ltpcm inpg fr a écrit :
Quote:
Bonjour

Bonjour,

Quote:
Je suis obligé de passer par un typedef du fait d'un bug de VC++6 qui
ne reconnait pas l'écriture
toto::Parent::method();

et Parent::method() ?

Quote:
Le problème est que lors de l'execution de Fille::method(), la
méthode parent n'est pas appelèe mais c'est elle même qui s'appèle
de façon récursive.
Fille -> Fille -> Fille ...
à la place de
Fille -> Parent

Qu'es-je donc fais de mal ? Wink

Si tu es sûr de ton code (et donc du bug de VC++), tu peux essayer ce
que ça donne avec le mot-clé spécifique __super:

__super::method();

si ça résoud le problème, ce mot-clé est facile à rendre portable:

#ifndef _MSC_VER
typedef toto::Parent __super;
#endif
__super::method();


--
Aurélien Regat-Barrel
Back to top
fpicca at ltpcm inpg fr
Guest





PostPosted: Tue Apr 25, 2006 3:06 pm    Post subject: Re: VC++6: method virtuelle de class parent non accessible. Reply with quote



Quote:
et Parent::method() ?

Le problème c'est que ma class parent et ma class fille ont toutes les
deux le même nom mais sont dans deux namespaces différents.

donc je ne peux pas utiliser Parent::method();

Quote:
Si tu es sûr de ton code (et donc du bug de VC++), tu peux essayer ce
que ça donne avec le mot-clé spécifique __super:

Oui je suis sur du bug:
http://support.microsoft.com/default.aspx?scid=kb%3Bfr%3B153801

Quote:
__super::method();

pour ce qui est de __super le compilateur me dit qu'il ne connaît pas
ce mot.
Faut-il inclure un header spéciale ?


Quote:

si ça résoud le problème, ce mot-clé est facile à rendre portable:

#ifndef _MSC_VER
typedef toto::Parent __super;
#endif
__super::method();

Cela me semble-t-il est équivalent à ce que microsoft préconise:
typedef toto:Parent BaseName;
BaseName::method();

Quote:


--
Aurélien Regat-Barrel
Back to top
fpicca at ltpcm inpg fr
Guest





PostPosted: Tue Apr 25, 2006 4:08 pm    Post subject: Re: VC++6: method virtuelle de class parent non accessible. Reply with quote

Quote:
Ce bug porte sur les nested classes, tu utilises des namespaces.
Etait-ce pour l'exemple ?

Non pas seulement, ma librairie contient des tas de namespace.


Quote:
Par sûr de ton code, je voulais dire sûr du programme de test, qu'il n'y
a pas une bête erreur genre Fille::methode est implémentée dans le
mauvais namespace ce qui fait qu'il s'agit de Parent::methode() (si
Fille et Parent ont le même nom). As-tu testé avec un autre compilo ?

Oui ca compile tres bien avec g++4.0.3

le code de ma method computeAngles est le suivant.

#ifdef MSVC6
//bug C2352
typedef hkl::mode::eulerian4C::vertical::Bissector
BaseName;
BaseName::computeAngles(h, k, l, UB,
m_geometry_E4C);
#else

mode::eulerian4C::vertical::Bissector::computeAngles(h, k, l, UB,
m_geometry_E4C);
#endif

Ce bout de code compila avec gcc et VC++6.
C'est juste à l'execution que je vois le différence.

Quote:
A défaut peux-tu poster un petit bout de code proche de ton cas qui
reproduit le problème ?

-------- mode_eulerian4C.h
#ifndef _MODE_EULERIAN4C_H_
#define _MODE_EULERIAN4C_H_

#include "mode.h"

namespace hkl {
namespace mode {
namespace eulerian4C {

/*!
* This class defines the mode for all the 4 circles
Eulerian diffractometers.
*/
class Vertical : /*virtual*/ public Mode
{
public:

virtual ~Vertical(void); //!< Default destructor

/*!
* \brief The main function to get a sample of angles
from (h,k,l).
* \param h The scaterring vector first element.
* \param k The scaterring vector second element.
* \param l The scaterring vector third element.
* \param UB The product of the orientation matrix U by
the crystal matrix B.
* \param[out] geometry The Geometry to calculate.
*
* The main function to get a sample of angles from
(h,k,l).
*/
virtual void computeAngles(double h, double k, double l,
smatrix const & UB,
Geometry & geometry) const
throw (HKLException) = 0;

protected:

Vertical(void); //!< Default constructor - protected to
make sure this class is abstract.
};

namespace vertical {

/*!
* The eulerian 4-circle diffractometer in bissector
mode.
*/
class Bissector : public Vertical
{
public:

Bissector(void); //!< Default constructor.

virtual ~Bissector(void); //!< Default Destructor.

virtual void computeAngles(double h, double k, double
l,
smatrix const & UB,
Geometry & geometry) const
throw (HKLException);
};
} // namespace vertical
} // namespace eulerian4C
} // namespace mode
} // namespace hkl

------------------

------------------- mode_kappa4C.h
#ifndef _MODE_KAPPA4C_H_
#define _MODE_KAPPA4C_H_

#include "mode.h"
#include "mode_eulerian4C.h"
#include "geometry_kappa4C.h"
#include "geometry_eulerian4C.h"

namespace hkl {
namespace mode {
namespace kappa4C {
/*!
* This class defines the mode for all the 4 circles Kappa
diffractometers.
*/
class Vertical
{
public:

virtual ~Vertical(void); //!< Default destructor

protected:
mutable geometry::eulerian4C::Vertical m_geometry_E4C;
//!< The geometry::Eulerian4C use for the calculation

Vertical(void); //!< Default constructor - protected to
make sure this class is abstract.
};

namespace vertical {

class Bissector : public
mode::eulerian4C::vertical::Bissector//, public mode::kappa4C::Vertical
{
public:

Bissector(void); //!< Default constructor.

virtual ~Bissector(void); //!< Default Destructor.

virtual void computeAngles(double h, double k, double
l,
smatrix const & UB,
Geometry & geometry) const
throw (HKLException);
protected:
mutable geometry::eulerian4C::Vertical
m_geometry_E4C; //!< The geometry::Eulerian4C use for the calculation
};
} // namespace vertical
} // namespace kappa4C
} // namespace mode
} // namespace hkl
-----------------------

Voila !
Back to top
Aurelien Regat-Barrel
Guest





PostPosted: Tue Apr 25, 2006 4:09 pm    Post subject: Re: VC++6: method virtuelle de class parent non accessible. Reply with quote

fpicca at ltpcm inpg fr a écrit :
Quote:
et Parent::method() ?


Le problème c'est que ma class parent et ma class fille ont toutes les
deux le même nom mais sont dans deux namespaces différents.

donc je ne peux pas utiliser Parent::method();


Si tu es sûr de ton code (et donc du bug de VC++), tu peux essayer ce
que ça donne avec le mot-clé spécifique __super:


Oui je suis sur du bug:
http://support.microsoft.com/default.aspx?scid=kb%3Bfr%3B153801

Ce bug porte sur les nested classes, tu utilises des namespaces.
Etait-ce pour l'exemple ?
Par sûr de ton code, je voulais dire sûr du programme de test, qu'il n'y
a pas une bête erreur genre Fille::methode est implémentée dans le
mauvais namespace ce qui fait qu'il s'agit de Parent::methode() (si
Fille et Parent ont le même nom). As-tu testé avec un autre compilo ?
A défaut peux-tu poster un petit bout de code proche de ton cas qui
reproduit le problème ?

Quote:
__super::method();


pour ce qui est de __super le compilateur me dit qu'il ne connaît pas
ce mot.
Faut-il inclure un header spéciale ?

J'ai vérifié trop vite : __super a été introduit après VC++ 6 semble-t-il.

Quote:
si ça résoud le problème, ce mot-clé est facile à rendre portable:

#ifndef _MSC_VER
typedef toto::Parent __super;
#endif
__super::method();


Cela me semble-t-il est équivalent à ce que microsoft préconise:
typedef toto:Parent BaseName;
BaseName::method();

note le ifndef et non pas ifdef, qui fait que le typedef n'est justement
pas utilisé avec VC++.

--
Aurélien Regat-Barrel
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.