3

私は次の小さな例(vala 0.18.1)を持っています:

namespace Learning
{
   public interface IExample<T>
   {
      public abstract void set_to(T val);
      public abstract T get_to();
   }

   public class Example : Object, IExample<double>
   {
      private double to;

      public void set_to(double val)
      {
         to = val;
      }

      public double get_to()
      {
         return to;
      }

      public string to_string()
      {
         return "Example: %.5f".printf(to);
      }
   }

   public class Test
   {
      public static void main(string[] args)
      {
         stdout.printf("Start test\n");

         Example ex = new Example();

         stdout.printf("%s\n", ex.to_string());
         ex.set_to(5.0);
         stdout.printf("%s\n", ex.to_string());

         stdout.printf("End test\n");
      }
   }
}

これはエラーをスローします:

/src/Test.vala.c: In function ‘learning_test_main’:
/src/Test.vala.c:253:2: error: incompatible type for argument 2 of ‘learning_iexample_set_to’
/src/Test.vala.c:117:6: note: expected ‘gconstpointer’ but argument is of type ‘double’
error: cc exited with status 256
Compilation failed: 1 error(s), 0 warning(s)

これで、Valaのジェネリックインターフェイス(http://www.vala-project.org/doc/vala-draft/generics.html#genericsexamples )で見つけた小さなドキュメントから、これは機能するはずです。結果のCコードを確認すると、Exampleのset_to関数がdoubleを取り、IExampleのset_to関数がgconstpointerを取りていることが示されています。

では、なぜmain関数がdoubleバージョンの代わりにgconstpointerバージョンを使用するのでしょうか。なぜそれが機能しないのか、そしてそれを回避する方法を誰かが私に説明できますか?

ご協力ありがとうございました。

PSはい、見つかったドキュメントはドラフトドキュメントであることを知っています。

回答コード:以下で選択した回答によると、これは私がコードを変更したものです。

namespace Learning
{
   public interface IExample<T>
   {
      public abstract void set_to(T val);
      public abstract T get_to();
   }

   public class Example : Object, IExample<double?>
   {
      private double? to;

      public void set_to(double? val)
      {
         to = val;
      }

      public double? get_to()
      {
         return to;
      }

      public string to_string()
      {
         return (to == null) ? "NULL" : "Example: %.5f".printf(to);
      }
   }

   public class Test
   {
      public static void main(string[] args)
      {
         stdout.printf("Start test\n");

         Example ex = new Example();

         stdout.printf("%s\n", ex.to_string());
         ex.set_to(5.0);
         stdout.printf("%s\n", ex.to_string());

         stdout.printf("End test\n");
      }
   }
}
4

1 に答える 1

1

を使用するのではなく、 をIExample<double>使用IExample<double?>して をボックス化doubleし、ポインターとして渡すことができるようにします。これは、一般に、structVala のどの型にも必要です。クラスとコンパクト クラスは、既にポインターであるため、この処理は必要ありません。また、 やなどstructの 32 ビットより小さい (64 ビット プラットフォームでも) 型は、ボクシングせずに直接使用できます。迷ったら箱詰め。uint8char

于 2012-12-31T14:38:18.373 に答える