1

2 つのテンプレート引数を使用してテンプレート関数を呼び出す際に問題が発生しています。

クラスがあり、そのクラスは 2 つの異なる型のオブジェクトを受け入れます。型はまだわからないので、テンプレートパラメータとして残しました。次に、オブジェクトをラッパー クラスに格納します。最後に、2 つのオブジェクトを受け取る 2 つのテンプレート引数を使用して、テンプレート化された関数を呼び出せるようにしたいと考えています。しかし、私はこれを行う方法に困惑しています。

これは、私の問題を説明するためのコードの簡略版です。

template<typename A, typename B>
void someTemplateFunction(A a, B b);


class Problem
{
  private:
    class WrapperA
    {
      public:
        virtual void doSomething() = 0;
    };

    template<typename A>
    class ConcreteWrapperA : public wrapperA
    {
      private:
        A a;
      public:
        ConcreteWrapperB(A b_) : a(a_) {}
        virtual void doSomething();
    };

    class WrapperB
    {
      public:
        virtual void doSomething() = 0;
    };

    template<typename B>
    class ConcreteWrapperB : public wrapperB
    {
      private:
        B b;
      public:
        ConcreteWrapperB(B b_) : b(b_) {}
        virtual void doSomething();
    };

    WrapperA *a;
    WrapperB *b;

  public:

    template<typename A>
    void setA(A a)
    {
      a = new ConcreteWrapperA<A>(a);
    }

    template<typename B>
    void setB(B b)
    {
      a = new ConcreteWrapperB<B>(b);
    }

    void call_someTemplateFunction(); // ??????? How do i do this?
};
4

1 に答える 1

2

A問題は、タイプとの両方を別々にタイプ消去Bしたため、コードの翻訳のどこにもタイプAとの両方Bが認識されていないことです。

単一の関数を記述できる場合は、その時点でtemplate<typename A, typename B> void set(A, B)ペアの型をキャプチャできます。<A, B>

someTemplateFunctionあるいは、両方のタイプAB同時に知らなくても動作する可能性はありますか?


これは、C++ を単一パスの個別のコンパイル言語として設計する上での基本的な問題です。

プログラムに 3 つのコンパイル単位があるとします。ある範囲の型でA.cpp呼び出し、別の範囲の型で呼び出し、オブジェクトを所有しており、呼び出したい。次に、コンパイラが の型の範囲の型の範囲の両方を認識しているコンパイル中の時間がないため、適切な cross-product でインスタンス化できません。setAT[A]B.cppsetBT[B]C.cppProblemsomeTemplateFunctionA.cpp B.cppsomeTemplateFunctionT[A] x T[B]

于 2012-09-06T16:14:27.720 に答える