【问题标题】:Template class typedef - use outside of class模板类 typedef - 在类外使用
【发布时间】:2012-05-10 09:16:51
【问题描述】:

我有这样的课程:

struct WorkItemResultData;

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      1. typedef模板外! - 如果它不依赖于类型,它可能与模板没有太大关系。
      2. 使用bodge并参考Engine&lt;void&gt;::WorkItemResultData_ptr
      3. 有一个非模板基类,它包含 typedef 并从它继承。之后就可以正常访问非模板基类了。

      【讨论】:

      • 我不想指定 typename :-)。我不在模板上下文中。
      • 我处于不知道/想知道引擎模板类型的上下文中。
      • @Ghita 如果它在模板中,您 可以指定某种类型。如果您知道该类型是什么并不重要,您始终可以将 void 作为类型传递。
      • 你是对的。 Engine 出现在非模板类之前,那时将 typedef 放在类型内部更有意义,但现在 Engine 是模板类之外的模板类 typedef 更有意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      相关资源
      最近更新 更多