3

我有这样的课:

struct WorkItemResultData;

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

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

编辑我知道我可以像 awoodland 那样使用它,提出下面的解决方案,但我的 typedef 独立于类型参数,并且希望能够在不指定特定引擎类型的情况下执行此操作。

4

2 回答 2

5

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

typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;

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

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

namespace Engine
{
    typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;
}
于 2012-05-10T09:31:52.117 回答
4

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

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

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

如果没有类型,您将无法访问它typedef。但是,有三种可能的解决方法:

  1. typedef模板外!- 如果它不依赖于类型,它可能与模板没有太大关系。
  2. 使用 bodge 并参考Engine<void>::WorkItemResultData_ptr.
  3. 有一个非模板基类,其中包含 typedef 并从中继承。然后您可以访问非模板基类。
于 2012-05-10T09:19:51.073 回答