3

C++テンプレートに問題があります。これが私がやろうとしていることの説明です。そうすれば、誰もが私の問題をよりよく理解できるようになります。

私のフレームワークには基本クラスがあり、私のフレームワークのユーザーはとなどの具象を作成するためComponentに派生します。Aは、特定のユーザーが作成したすべての具象のリストを格納します。ComponentComponentsTransformComponentAudioComponentComponentComposite Component

とsComponentsを介してコンクリートのリストを保存しようとしています。boost::anyboost::any_cast

以下はの2つの方法ComponentCompositeと私のリストですboost::any

    class ComponentComposite {

        public:
            ComponentComposite();
            template<class T> bool addComponent(T* component);
            template<class T> T* getComponent();

        private:
            QList<boost::any*>* m_components;
    }

これは、のサンプルコードGameObjectですComponentCompositeComponentに2つのを追加しよGameObjectうとしています。次に、追加された2つのにアクセスしようとしてComponentいます。そのようなことを行うことは、の一般的なユースケースになりComponentCompositeます。

    GameObject::GameObject() : ComponentComposite()
    {
        addComponent<Components::AudioComponent>(new Components::AudioComponent());
        addComponent<Components::TransformComponent>(new Components::TransformComponent());
        Components::TransformComponent* transform= getComponent<Components::TransformComponent>();
        Components::AudioComponent* audio= getComponent<Components::AudioComponent>();
    }

これを行うと、4つのエラー(関数呼び出しごとに1つ)がスローされます。

  1. ...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent<BalaurEngine::Components::AudioComponent>(BalaurEngine::Components::AudioComponent*)'
  2. ...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent<BalaurEngine::Components::TransformComponent>(BalaurEngine::Components::TransformComponent*)'
  3. ...undefined reference to `BalaurEngine::Components::TransformComponent* BalaurEngine::Composites::ComponentComposite::getComponent<BalaurEngine::Components::TransformComponent>()'
  4. ...undefined reference to `BalaurEngine::Components::AudioComponent* BalaurEngine::Composites::ComponentComposite::getComponent<BalaurEngine::Components::AudioComponent>()'

誰かが望むなら、私は私のメソッドのソースコードを投稿することができtemplate<class T> bool addComponent(T* component);ますtemplate<class T> T* getComponent();

4

1 に答える 1

0

これは回答済みです - 最後のコメントを参照してください:

@Mutmansky、C ++で実装されたテンプレート化された関数は、テンプレート化された関数の定義とともにヘッダーにある必要があることに気づきませんでした。これを行った後、Scott Langham のアドバイスに従って、コンパイラ エラーは消えました。ファイルのソース コードをご覧になりたい場合は、喜んでここに投稿するか、メッセージでお知らせします。お知らせ下さい!

于 2012-05-10T17:37:37.117 に答える