模板类typedef - 在类外使用

时间:2012-05-10 09:16:52

标签: c++ visual-studio-2010 templates

我有一个这样的课程:

struct WorkItemResultData;

template <typename ExecutionPolicy>
class Engine
{
public:
    typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;
}

typedef不依赖于任何模板参数。有没有办法在Engine::WorkItemResultData_ptr类之外使用类型Engine

编辑我知道我可以像awoodland一样使用它提出了解决方案,但我的typedef独立于类型参数,并希望能够在不指定特定引擎类型的情况下完成。

2 个答案:

答案 0 :(得分:3)

  

有没有办法在Engine类之外使用类型Engine::WorkItemResultData_ptr

是的,但如果它在模板上下文中,您需要说typename,例如:

template <typename T>
void foo() {
  typename Engine<T>::WorkItemResultData_ptr instance;
}

如果没有类型,您无法访问typedef。有三种可行的解决方法:

    模板外的
  1. typedef! - 如果模板不依赖于类型,它可能与模板没什么关系。
  2. 使用bodge并参考Engine<void>::WorkItemResultData_ptr
  3. 拥有一个非模板基类,其中包含typedef并从中继承。您可以很好地访问非模板基类。

答案 1 :(得分:3)

由于typedef根本不依赖于Engine,所以你可以将它从类中拉出来:

typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;

template <typename ExecutionPolicy>
class Engine {...};

如果要保持封装,只需使用命名空间:

namespace Engine
{
    typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;
}