Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation des forward declaration avec des value class

9 réponses
Avatar
Jerome
Re-Bonjour,

Apres l'insistance de certain(s) ... nouveau post

Voici un petit exemple MC++ que j'essaye de faire compiler:

namespace managedDll
{
public __value class VecDouble;
public __value class VecFloat
{
public:
void SetValue(VecDouble vec)
{
// TODO
}
};
public __value class VecDouble
{
public:
void SetValue(VecFloat vec)
{
// TODO
}
};
}

J'ai l'erreur suivante a la compil:
error C2027: use of undefined type 'managedDll::VecDouble'
Le fait que mes methodes soient inline ne change rien au pb car elles ne
sont pas implementees.

Par contre tout se passe bien si mes methodes SetValue ont pour signature
(Vec(Double | Float) &vec). Le probleme est que le & n'est pas logique car
quand je veux appeler mes methodes depuis du code depuis du C# je suis
oblige de declarer un objet puis de faire appel a la methode en precisant
ref

VecDouble vec = new VecDouble();
vecFloat.SetValue(ref vec);

Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())

Je suis convaincu de l'existance d'une super solution ... mais je l'ai pas
encore trouvee :-(

Jerome

9 réponses

Avatar
Simon Mourier
Pourquoi vouloir absolument faire du MC++? Y a t il une raison précise?
Parce que si vous démarrez un projet, il faut déjà se poser la question de
l'intêret du C/C++, et ensuite, si ces langages sont vraiment nécessaires,
comme vous utilisez C# d'un coté, il est plus simple de faire du "pur" .NET
en C# et le reste en C++ "normal", avec des exports DLL standards (extern
"C").

Mais faire du .NET objet etc..., en C++... ca n'a pas grand intêret, à mon
humble avis...

Simon.
www.softfluent.com


"Jerome" a écrit dans le message de news:
%
Re-Bonjour,

Apres l'insistance de certain(s) ... nouveau post

Voici un petit exemple MC++ que j'essaye de faire compiler:

namespace managedDll
{
public __value class VecDouble;
public __value class VecFloat
{
public:
void SetValue(VecDouble vec)
{
// TODO
}
};
public __value class VecDouble
{
public:
void SetValue(VecFloat vec)
{
// TODO
}
};
}

J'ai l'erreur suivante a la compil:
error C2027: use of undefined type 'managedDll::VecDouble'
Le fait que mes methodes soient inline ne change rien au pb car elles ne
sont pas implementees.

Par contre tout se passe bien si mes methodes SetValue ont pour signature
(Vec(Double | Float) &vec). Le probleme est que le & n'est pas logique
car
quand je veux appeler mes methodes depuis du code depuis du C# je suis
oblige de declarer un objet puis de faire appel a la methode en precisant
ref

VecDouble vec = new VecDouble();
vecFloat.SetValue(ref vec);

Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())

Je suis convaincu de l'existance d'une super solution ... mais je l'ai pas
encore trouvee :-(

Jerome




Avatar
Jerome
OUI OUI la raison est que j'interface un SDK C++ pour en faire un SDK .NET
et que nous avons fait le choix du managed C++ pour des raisons de
performances. J'ai pris l'exemple du C# car le premier utilisateur utilisera
le C#.

Il me semble bien que ce language est fait pour ca ... non ?
Mais je suis loin d'etre au premier probleme rencontre ... je crois que ce
language n'est pas assez "mature".

J'ose esperer qu'il y a une solution a ce probleme ... sans quoi ce probleme
remet en cause notre choix.

Jerome.

"Simon Mourier" a écrit dans le message de
news:
Pourquoi vouloir absolument faire du MC++? Y a t il une raison précise?
Parce que si vous démarrez un projet, il faut déjà se poser la question de
l'intêret du C/C++, et ensuite, si ces langages sont vraiment nécessaires,
comme vous utilisez C# d'un coté, il est plus simple de faire du "pur"


.NET
en C# et le reste en C++ "normal", avec des exports DLL standards (extern
"C").

Mais faire du .NET objet etc..., en C++... ca n'a pas grand intêret, à mon
humble avis...

Simon.
www.softfluent.com


"Jerome" a écrit dans le message de news:
%
> Re-Bonjour,
>
> Apres l'insistance de certain(s) ... nouveau post
>
> Voici un petit exemple MC++ que j'essaye de faire compiler:
>
> namespace managedDll
> {
> public __value class VecDouble;
> public __value class VecFloat
> {
> public:
> void SetValue(VecDouble vec)
> {
> // TODO
> }
> };
> public __value class VecDouble
> {
> public:
> void SetValue(VecFloat vec)
> {
> // TODO
> }
> };
> }
>
> J'ai l'erreur suivante a la compil:
> error C2027: use of undefined type 'managedDll::VecDouble'
> Le fait que mes methodes soient inline ne change rien au pb car elles ne
> sont pas implementees.
>
> Par contre tout se passe bien si mes methodes SetValue ont pour


signature
> (Vec(Double | Float) &vec). Le probleme est que le & n'est pas logique
> car
> quand je veux appeler mes methodes depuis du code depuis du C# je suis
> oblige de declarer un objet puis de faire appel a la methode en


precisant
> ref
>
> VecDouble vec = new VecDouble();
> vecFloat.SetValue(ref vec);
>
> Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())
>
> Je suis convaincu de l'existance d'une super solution ... mais je l'ai


pas
> encore trouvee :-(
>
> Jerome
>
>




Avatar
Simon Mourier
Il y a certainement des solutions à ce problème. Mais C# c'est très
performant aussi.

Finalement, peu de projets (je vois météo, calculs scientifiques, moteurs de
jeux, etc...) requièrement absolument C/C++. Et souvent certains programmes
C/C++ gagneraient paradoxalement à être écrits en C# (ou VB.NET) pour des
raisons de faible compétence des développeurs en C/C++.

Si c'est pour faire une application "de gestion", C/C++ ne sert strictement
à rien, surtout si vous avez déjà du C# dans votre solution. Et quand bien
même on a vraiment besoin de C/C++ pour des endroits bien spécifiques et
identifiés, autant le faire "à l'ancienne" avec des exports de DLL et
intéropérer avec .NET de manière simple, plutôt que de se casser la tête
avec MC++.

My 0.02?

Simon.
www.softfluent.com


"Jerome" a écrit dans le message de news:
elIOf%
OUI OUI la raison est que j'interface un SDK C++ pour en faire un SDK .NET
et que nous avons fait le choix du managed C++ pour des raisons de
performances. J'ai pris l'exemple du C# car le premier utilisateur
utilisera
le C#.

Il me semble bien que ce language est fait pour ca ... non ?
Mais je suis loin d'etre au premier probleme rencontre ... je crois que ce
language n'est pas assez "mature".

J'ose esperer qu'il y a une solution a ce probleme ... sans quoi ce
probleme
remet en cause notre choix.

Jerome.

"Simon Mourier" a écrit dans le message de
news:
Pourquoi vouloir absolument faire du MC++? Y a t il une raison précise?
Parce que si vous démarrez un projet, il faut déjà se poser la question
de
l'intêret du C/C++, et ensuite, si ces langages sont vraiment
nécessaires,
comme vous utilisez C# d'un coté, il est plus simple de faire du "pur"


.NET
en C# et le reste en C++ "normal", avec des exports DLL standards (extern
"C").

Mais faire du .NET objet etc..., en C++... ca n'a pas grand intêret, à
mon
humble avis...

Simon.
www.softfluent.com


"Jerome" a écrit dans le message de news:
%
> Re-Bonjour,
>
> Apres l'insistance de certain(s) ... nouveau post
>
> Voici un petit exemple MC++ que j'essaye de faire compiler:
>
> namespace managedDll
> {
> public __value class VecDouble;
> public __value class VecFloat
> {
> public:
> void SetValue(VecDouble vec)
> {
> // TODO
> }
> };
> public __value class VecDouble
> {
> public:
> void SetValue(VecFloat vec)
> {
> // TODO
> }
> };
> }
>
> J'ai l'erreur suivante a la compil:
> error C2027: use of undefined type 'managedDll::VecDouble'
> Le fait que mes methodes soient inline ne change rien au pb car elles
> ne
> sont pas implementees.
>
> Par contre tout se passe bien si mes methodes SetValue ont pour


signature
> (Vec(Double | Float) &vec). Le probleme est que le & n'est pas logique
> car
> quand je veux appeler mes methodes depuis du code depuis du C# je suis
> oblige de declarer un objet puis de faire appel a la methode en


precisant
> ref
>
> VecDouble vec = new VecDouble();
> vecFloat.SetValue(ref vec);
>
> Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())
>
> Je suis convaincu de l'existance d'une super solution ... mais je l'ai


pas
> encore trouvee :-(
>
> Jerome
>
>








Avatar
Jerome
Je suis dans la categorie "calcul scientifique" et pour des aspects de
gestion memoire (donnees de l'ordre du Gigabit), je ne peux pas me permettre
de reecrire mon SDK C++ en C# (egalament probleme de maintenance,
documentation, ...)

Je persiste dans le choix managed C++. Les exports de DLL multiplie le code
(une assembly .NET, une DLL C pour l'interface avec du C++) ... et donne
generalement des performances moindre (sur les quelques tests que j'ai pu
faire).

Pourquoi dite vous que c'est de se casser la tete avec du MC++ ? MC++ n'a
rien a envier a PInvoke ...

Sinon je suis toujours a la recherche de la solution a mon probleme.

Jerome.

"Simon Mourier" a écrit dans le message de
news:
Il y a certainement des solutions à ce problème. Mais C# c'est très
performant aussi.

Finalement, peu de projets (je vois météo, calculs scientifiques, moteurs


de
jeux, etc...) requièrement absolument C/C++. Et souvent certains


programmes
C/C++ gagneraient paradoxalement à être écrits en C# (ou VB.NET) pour des
raisons de faible compétence des développeurs en C/C++.

Si c'est pour faire une application "de gestion", C/C++ ne sert


strictement
à rien, surtout si vous avez déjà du C# dans votre solution. Et quand bien
même on a vraiment besoin de C/C++ pour des endroits bien spécifiques et
identifiés, autant le faire "à l'ancienne" avec des exports de DLL et
intéropérer avec .NET de manière simple, plutôt que de se casser la tête
avec MC++.

My 0.02?

Simon.
www.softfluent.com


"Jerome" a écrit dans le message de news:
elIOf%
> OUI OUI la raison est que j'interface un SDK C++ pour en faire un SDK


.NET
> et que nous avons fait le choix du managed C++ pour des raisons de
> performances. J'ai pris l'exemple du C# car le premier utilisateur
> utilisera
> le C#.
>
> Il me semble bien que ce language est fait pour ca ... non ?
> Mais je suis loin d'etre au premier probleme rencontre ... je crois que


ce
> language n'est pas assez "mature".
>
> J'ose esperer qu'il y a une solution a ce probleme ... sans quoi ce
> probleme
> remet en cause notre choix.
>
> Jerome.
>
> "Simon Mourier" a écrit dans le message de
> news:
>> Pourquoi vouloir absolument faire du MC++? Y a t il une raison précise?
>> Parce que si vous démarrez un projet, il faut déjà se poser la question
>> de
>> l'intêret du C/C++, et ensuite, si ces langages sont vraiment
>> nécessaires,
>> comme vous utilisez C# d'un coté, il est plus simple de faire du "pur"
> .NET
>> en C# et le reste en C++ "normal", avec des exports DLL standards


(extern
>> "C").
>>
>> Mais faire du .NET objet etc..., en C++... ca n'a pas grand intêret, à
>> mon
>> humble avis...
>>
>> Simon.
>> www.softfluent.com
>>
>>
>> "Jerome" a écrit dans le message de news:
>> %
>> > Re-Bonjour,
>> >
>> > Apres l'insistance de certain(s) ... nouveau post
>> >
>> > Voici un petit exemple MC++ que j'essaye de faire compiler:
>> >
>> > namespace managedDll
>> > {
>> > public __value class VecDouble;
>> > public __value class VecFloat
>> > {
>> > public:
>> > void SetValue(VecDouble vec)
>> > {
>> > // TODO
>> > }
>> > };
>> > public __value class VecDouble
>> > {
>> > public:
>> > void SetValue(VecFloat vec)
>> > {
>> > // TODO
>> > }
>> > };
>> > }
>> >
>> > J'ai l'erreur suivante a la compil:
>> > error C2027: use of undefined type 'managedDll::VecDouble'
>> > Le fait que mes methodes soient inline ne change rien au pb car elles
>> > ne
>> > sont pas implementees.
>> >
>> > Par contre tout se passe bien si mes methodes SetValue ont pour
> signature
>> > (Vec(Double | Float) &vec). Le probleme est que le & n'est pas


logique
>> > car
>> > quand je veux appeler mes methodes depuis du code depuis du C# je


suis
>> > oblige de declarer un objet puis de faire appel a la methode en
> precisant
>> > ref
>> >
>> > VecDouble vec = new VecDouble();
>> > vecFloat.SetValue(ref vec);
>> >
>> > Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())
>> >
>> > Je suis convaincu de l'existance d'une super solution ... mais je


l'ai
> pas
>> > encore trouvee :-(
>> >
>> > Jerome
>> >
>> >
>>
>>
>
>




Avatar
Jerome
Je viens de trouver la solution ... il suffit de ne pas declarer la methode
VecFloat::SetValue inline ... j'etais persuade d'avoir essaye.

Merci a tous quand meme !

Jerome
"Jerome" a écrit dans le message de
news:%
Re-Bonjour,

Apres l'insistance de certain(s) ... nouveau post

Voici un petit exemple MC++ que j'essaye de faire compiler:

namespace managedDll
{
public __value class VecDouble;
public __value class VecFloat
{
public:
void SetValue(VecDouble vec)
{
// TODO
}
};
public __value class VecDouble
{
public:
void SetValue(VecFloat vec)
{
// TODO
}
};
}

J'ai l'erreur suivante a la compil:
error C2027: use of undefined type 'managedDll::VecDouble'
Le fait que mes methodes soient inline ne change rien au pb car elles ne
sont pas implementees.

Par contre tout se passe bien si mes methodes SetValue ont pour signature
(Vec(Double | Float) &vec). Le probleme est que le & n'est pas logique


car
quand je veux appeler mes methodes depuis du code depuis du C# je suis
oblige de declarer un objet puis de faire appel a la methode en precisant
ref

VecDouble vec = new VecDouble();
vecFloat.SetValue(ref vec);

Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())

Je suis convaincu de l'existance d'une super solution ... mais je l'ai pas
encore trouvee :-(

Jerome




Avatar
Paul Bacelar
Merci d'avoir donné la réponse, car moi, j'avais séché :-(
--
Paul Bacelar
MVP VisualC++ (houuuu, la honte)

"Jerome" wrote in message
news:
Je viens de trouver la solution ... il suffit de ne pas declarer la


methode
VecFloat::SetValue inline ... j'etais persuade d'avoir essaye.

Merci a tous quand meme !

Jerome
"Jerome" a écrit dans le message de
news:%
> Re-Bonjour,
>
> Apres l'insistance de certain(s) ... nouveau post
>
> Voici un petit exemple MC++ que j'essaye de faire compiler:
>
> namespace managedDll
> {
> public __value class VecDouble;
> public __value class VecFloat
> {
> public:
> void SetValue(VecDouble vec)
> {
> // TODO
> }
> };
> public __value class VecDouble
> {
> public:
> void SetValue(VecFloat vec)
> {
> // TODO
> }
> };
> }
>
> J'ai l'erreur suivante a la compil:
> error C2027: use of undefined type 'managedDll::VecDouble'
> Le fait que mes methodes soient inline ne change rien au pb car elles ne
> sont pas implementees.
>
> Par contre tout se passe bien si mes methodes SetValue ont pour


signature
> (Vec(Double | Float) &vec). Le probleme est que le & n'est pas logique
car
> quand je veux appeler mes methodes depuis du code depuis du C# je suis
> oblige de declarer un objet puis de faire appel a la methode en


precisant
> ref
>
> VecDouble vec = new VecDouble();
> vecFloat.SetValue(ref vec);
>
> Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())
>
> Je suis convaincu de l'existance d'une super solution ... mais je l'ai


pas
> encore trouvee :-(
>
> Jerome
>
>




Avatar
Lloyd Dupont
en passant le managed C++ v2 a une syntaxe differente (et incompatible, un
flag du compileur les separe) de la v1, he oui.

cela dis la v2 est beaucoup plus propre et moins ambigue. elle est aussi
enregistrer aupres de l'ECMA (contrairement a la v1).

vous avez soulevez le probleme du manque de maturite du MC++, essayez la v2,
c'est bien mieux!

"Jerome" wrote in message
news:
Je viens de trouver la solution ... il suffit de ne pas declarer la
methode
VecFloat::SetValue inline ... j'etais persuade d'avoir essaye.

Merci a tous quand meme !

Jerome
"Jerome" a écrit dans le message de
news:%
Re-Bonjour,

Apres l'insistance de certain(s) ... nouveau post

Voici un petit exemple MC++ que j'essaye de faire compiler:

namespace managedDll
{
public __value class VecDouble;
public __value class VecFloat
{
public:
void SetValue(VecDouble vec)
{
// TODO
}
};
public __value class VecDouble
{
public:
void SetValue(VecFloat vec)
{
// TODO
}
};
}

J'ai l'erreur suivante a la compil:
error C2027: use of undefined type 'managedDll::VecDouble'
Le fait que mes methodes soient inline ne change rien au pb car elles ne
sont pas implementees.

Par contre tout se passe bien si mes methodes SetValue ont pour signature
(Vec(Double | Float) &vec). Le probleme est que le & n'est pas logique


car
quand je veux appeler mes methodes depuis du code depuis du C# je suis
oblige de declarer un objet puis de faire appel a la methode en precisant
ref

VecDouble vec = new VecDouble();
vecFloat.SetValue(ref vec);

Alors que je voudrais ecrire vecFloat.SetValue(new VecDouble())

Je suis convaincu de l'existance d'une super solution ... mais je l'ai
pas
encore trouvee :-(

Jerome








Avatar
Ambassadeur Kosh
"Jerome" a écrit dans le message de news:
%
Re-Bonjour,

Apres l'insistance de certain(s) ... nouveau post



enleve le premier public. quand tu fais une forward decl, faut pas
mentionner la visiblité. par contre, faut le "comportement"



Finalement, peu de projets (je vois météo, calculs scientifiques, moteurs
de
jeux, etc...) requièrement absolument C/C++. Et souvent certains
programmes
C/C++ gagneraient paradoxalement à être écrits en C# (ou VB.NET) pour des
raisons de faible compétence des développeurs en C/C++.




je confirme cette affirmation ! ayant écrit un (petit) framework
d'optimisation, je peu dire que j'ai des performances tout aussi bonnes. peu
être un tout petit peu moins rapide, mais le gain en productivité et en
qualité est tel que ça pese tres peu dans la balance au final.

tu devrais tenir compte du conseil de Simon...
Avatar
Ambassadeur Kosh
> enleve le premier public. quand tu fais une forward decl, faut pas
mentionner la visiblité. par contre, faut le "comportement"



oublie ça. marche qu'avec ref.
ceci dit, ça va dans le sens de ce qu'on disait, et c'est typique du C++ :
"comment s'emmerder avec des conneries qui ne servent à rien"