1

CodeSynthesis XSD C++/ツリー マッピング ユーティリティを使用して、既存の xsd を値を入力できる C++ コードに変換しています。

変換を行った後、テストできるように動作させようとしています。問題は、私はこれを C++ で行うことに慣れておらず、このツールを初めて使用することです。

versno_typeまず、ABSTRACTNETWORKMODEL と呼ばれる、型とfromtime_type typedef を内部に持つクラスから始めます。これは、私が使用しようとしているコンストラクターとtypedefです

ABSTRACTNETWORKMODEL(const versno_type&, const fromtime_type&);
typedef ::xml_schema::double_ versno_type;
typedef ::xml_schema::time fromtime_type;

これらはすべて ABSTRACTNETWORKMODEL クラスにあり、double_ と time の定義は次のとおりです。

typedef ::xsd::cxx::tree::time<char, simple_type> time;
typedef double double_;

time の定義は、複数のコンストラクターを持つクラスです。

template<typename C, typename B>
class time: public B, public time_zone
{
  public:
  time(unsigned short hours, unsigned short minutes, double seconds);
  ...
}

新しい ABSTRACTNETWORKMODEL を正しく作成していないことはわかっていますが、これを行う必要があるかどうかはわかりません。この時点で私がやろうとしているのは次のとおりです。

  ::xml_schema::time t();
  ABSTRACTNETWORKMODEL anm(1234, t);

もちろん、これは2番目のパラメーターの変換に関するエラーをスローしますが、何が間違っているのか教えてもらえますか? または、少なくとも私が今やろうとしていることの 1 つは C++ をもっと学ぶことなので、正しい道を教えてくれます。

4

2 に答える 2

3

私は前にこれに噛まれたことがあります。行の場合:

::xml_schema::time t();

コードに表示されているとおりに(つまり、parensを使用して)、問題は、実際にオブジェクトを思いどおりにインスタンス化していないことです。

使用するオブジェクトをインスタンス化するには

::xml_schema::time t;

代わりに、最初の行は、引数をとらず、型のオブジェクトを返す関数t()を宣言しています::xml_schema::time。本体がないため、コンパイラは後で関数を定義すると考えます。これは完全に合法的なC++であり、人々が(たとえばヘッダーファイルで)多くのことを行うため、コンパイラはそれを受け入れ、それが意図したものではないことを知る方法がないため警告を発行せず、あなたが意図していないことを実行します期待していません。

そして、その関数をABSTRACTNETWORKMODELコンストラクターに渡すと、引数として関数を渡すことができないため、エラーが発生します(関数へのポインターを渡すことができ、関数を呼び出して、結果の一時的なものを渡すことができます):

::xml_schema::time t();
ABSTRACTNETWORKMODEL anm(1234, t()); // calls t(), gets a temporary of type ::xml_schema::time, and passes the temporary to the constructor

したがって、「時間のインスタンス化によってエラーが発生しなかった」理由は、時間オブジェクトがインスタンス化されなかったためです。時間クラスにもデフォルトのコンストラクターがなく、正しい構文でtをインスタンス化しようとすると、予期したエラーがスローされます。

記録のために、場合によっては括弧が必要になります。たとえば、一時オブジェクトをインスタンス化し、同じ行でその一時オブジェクトを操作する場合、次のようになります。

int hours = time().get_hours(); // assuming that there is now a default constructor

最初の括弧のセットを削除するとエラーが発生するため、次のようになります。

int hours = time.set_time("12:00:00am"); // error: there is a time class, but no object named "time"

私を信じてください、私はC ++が本当に好きです、しかし構文は時々まっすぐに保つのが本当に難しいかもしれません。

于 2008-10-03T18:13:44.703 に答える
0

オフィスの周りで尋ねたところ、私の問題はABSTRACTNETWORKMODELの作成ではなかったようですが、実際には:: xml_schema::timeでした。

デフォルトのコンストラクターがないこと、またはテンプレートとタイプが正しいにもかかわらず受け入れられなかった理由を考えると、時間のインスタンス化によってエラーが発生しなかったのは奇妙だと思います。

于 2008-10-02T21:24:33.773 に答える