2011-01-11 11 views
1

私はC++ structのコンストラクタを定義しようとしますが、同時にこれもエクスポートしたい構造体です。だからここに私のコードです:行方不明のタイプspecifier- intは仮定:しかし構造体がコンストラクタを取ることができません__declspec(dllexport)を使用する場合

extern "C"__declspec(dllexport) typedef struct 
{ 
    double x; 
    double y; 

    PointCg(double xx, double yy); 
}PointCg; 

、私は

はエラーC4430というコンパイルエラーを得ました。注:C++は をサポートしていません。

しかし、これは完全に有効な宣言ですか?

私はvisual-C++ 2008を使用しています。

答えて

2

typedefsは基本型のエイリアスです。これは、typedefがコンパイル時であり、リンク時の構造ではないことを意味します。

サンプルコードでは、匿名構造体のtypedefをdllexportしようとしています。これはコンパイラを2つのレベルで混乱させます。まず、実行したくないエイリアスをエクスポートし、次に構造体自体は匿名であるため、それをエクスポートすることさえできません。第三に、コンストラクタのように見えるものはありません。奇妙な名前の関数です。 ctorは構造体の名前を持つ必要があります。

extern "C"__declspec(dllexport) struct PointCg 
{ 
    double x; 
    double y; 
    PointCg(double xx, double yy); 
}; 
3

__declspecは何も持っていません。この質問は、構造体を使用した場合のルールの多くを緩和し、C++ ...なぜあなただ​​けのtypedefをスキップし、構造体に名前を与えるいけないです考える

それに関係する。あなたは匿名の構造体を定義しています。型定義名はコンストラクタを定義するためには機能しません。定義の中では、PointCgは関数名のように見え、関数には戻り値の型が必要です。これはC++で構造体を定義する方法である:

struct PointCg{ 
    //.... 
    PointGc(double xx, double yy); 
}; 

Cとは異なり、あなたはどこにでもstructを入力して回避するために、構造体の名前をtypedefをする必要はありませんし、その型を参照するときだけPointCgの代わりstruct PointCgを使用することができます。

1

エラーC4430:mising type specifier-intが仮定されています。注:C++はdefault-intをサポートしていません

これは、ほとんどの場合、コンパイラに何も意味しない名前を導入したことを意味します。そして確かに私はこれがここに当てはまると信じています。構造を定義する古くからのCテクニックを採用しています:typedef struct。コンパイラが(まだ名前のない)構造体のコンストラクタに到達すると、PointCgという名前は何も意味しません。 typedefの最後に}という名前が付けられるまでは、何も意味しません。私は次のようにあなたのコードを変更示唆

:C++で

extern "C"__declspec(dllexport) struct PointCg 
{ 
    double x; 
    double y; 

    PointCg(double xx, double yy); 
}; 

を、古いtypedef struct技術を使用する理由は、文字通り決してありません。これは痛みや混乱の原因になるだけで、何も得られません。

関連する問題