-1
class Node {
public:
  template<class T>  T*   GetComponent() {
     return new T(this);  // actual code is more complicated!
  }

  Transform*   Transform() {
      return this->GetComponent<Transform>();   // invalid template argument for 'T', type expected
  }
};

しかし、同じメソッドを別の場所から呼び出すとうまくいきます! main() のように。このコードの何が問題なのですか!!!

4

1 に答える 1

1

すでに言及されているように、提供したコードにはタイプミスがあります。それらを修正すると、あなたが言及したエラーが発生します。

これを取得する理由は、Transform具象化したい型と同じ名前のメンバー関数があるGetComponentためです。したがって、解決策は、名前空間を含む完全な型名を使用してコンパイラを「支援」することです。Transformこれは、がグローバル名前空間で定義されていることを前提としています。

Transform*   Transform() {
    return this->GetComponent<::Transform>();
}

名前空間で定義した場合は、これを使用します。

Transform*   Transform() {
    return this->GetComponent<::YOUR_NAMESPACE::Transform>();
}

編集:私が使用した完全なコード:

class Node;
class Transform
{
public:
    Transform(Node*);
};

class Node {
public:
    template <class T>  
    T*   GetComponent() {
        return new T(this);
    }

    Transform*   Transform() {
        return this->GetComponent<::Transform>();
    }
};
于 2013-01-25T14:11:16.707 に答える