有没有办法继承别名模板?

Cha*_*s W 8 c++ templates

我有一个模板基类:

template<class EntityManager>
class System {
public:
  virtual void Update(EntityManager& entity_manager, double dt) = 0;
protected:
  template<typename T> using Component = typename EntityManager::template Component<T>;
};
Run Code Online (Sandbox Code Playgroud)

我想Component<T>在我的派生模板类中使用.

我试图将System声明声明Component为它自己的类,但是当我尝试引用它时,编译器返回,'Component' was not declared in this scope.

有什么建议?

编辑: Inteded用法:

template class<typename EntityManager>
class MovementSystem : public System<EntityManager> {
public:
  virtual void Update(EntityManager& entity_manager, double dt) {
    Component<Position> position_component; // I'd like to use Component<T> here.
  }
};
Run Code Online (Sandbox Code Playgroud)

Che*_*Alf 5

在派生类模板(很可能是你的意思)中你可以做到

using Component = typename System<T>::Component;
Run Code Online (Sandbox Code Playgroud)

T派生类中哪里是适当的类型.


处理模板可以执行以下操作:

template< class U > using Component = typename System<T>::template Component<U>;
Run Code Online (Sandbox Code Playgroud)

正如评论中的dyp所述.

细节取决于上下文,这里是编辑帖子时给出的代码的具体示例:

class ET
{
public:
    template< class Type >
    struct Component {};
};

template<class EntityManager>
class System {
public:
  virtual void Update(EntityManager& entity_manager, double dt) = 0;
protected:
  template<typename T> using Component = typename EntityManager::template Component<T>;
};

template< class EntityManager >
class MovementSystem : public System<EntityManager> {
public:
#ifndef DONTFIXIT
  template< class T > using Component = typename EntityManager::template Component< T >;
#endif

  virtual void Update(EntityManager& entity_manager, double dt) {
    Component<int> position_component; // I'd like to use Component<T> here.
  }
};

auto main() -> int
{
    MovementSystem< ET > ms;
}
Run Code Online (Sandbox Code Playgroud)

抱歉,没有简单的方法可以做到这一点.

这显然是核心语言有可能更好地支持程序员的一个领域,避免一遍又一遍地重述名称.


语言的基本原理是,某些专业化System可能不一定定义一个Component类型或可访问类型.

随着using您使编译器诊断缺乏这种类型的,在前面.

  • *"语言的基本原理是,系统的某些特殊化可能不一定定义组件类型或可访问的类型."*[这是问题的一个例子](http://coliru.stacked- crooked.com/a/ef3b3a577caa66ae) (2认同)