【问题标题】:Can an inner class of a template class be a non-template class?模板类的内部类可以是非模板类吗?
【发布时间】:2011-10-08 22:22:32
【问题描述】:

我正在制作一个带有内部实用程序类的模板类。模板的所有特化都需要相同的内部类:

template<...> class Outer {
    class Inner { };
};

这给了我Outer&lt;...&gt;::Inner,但我希望所有Inner 都是同一类型,就像我刚刚写的一样:

class Inner { };
template <...> class Outer { };

或者如果Outer 根本不是模板类:

class Outer {
    class Inner { };
};

给我Outer::Inner。如果可能的话,我想让Outer::Inner 为所有Outer&lt;&gt; 工作(仅出于命名空间/清晰度的原因)。否则我当然可以将Inner 移出。

【问题讨论】:

  • 我很确定答案是否定的,但我希望有人证明我错了,因为我恰好处于类似的情况:)
  • 我只是相当确定答案是否定的,但我也希望有聪明的解决方法......

标签: c++ templates inner-classes


【解决方案1】:

嵌套类可以是非模板,但模板的每个实例化都会有自己的嵌套类,因为它们(否则)是不相关的类型。你可以这样做

namespace detail {

class Inner {};

} // detail

template<...>
class Outer {
    typedef detail::Inner Inner;
};

【讨论】:

  • 我忘记了我的命名空间详细信息 - 现在可以隐藏class Inner,就像它在“真正的”内部类中一样?或者任何包含代码都可以使用吗?
  • @Nate 以上行为与任何typedef 相同。 Inner 可以不完整,只有一个不是定义的声明(即class Inner;),并包含它所暗示的所有警告。但它必须声明(名称detail::Inner 必须引用某些东西),否则它不能是typedef'd。
【解决方案2】:

我过去的做法是使用继承:

class DummyBase{
protected:
    class Inner{
        //etc...
    };
};

template<...> class Outer : public DummyBase{
    //etc...
};

【讨论】:

  • +1,因为这使得Outer&lt;&gt;::Inner 成为真正的类名。所以class Outer&lt;&gt;::Inner x;friend class Outer&lt;&gt;::Inner; 仍然可以工作,而typedef 解决方案将在那里失败。
【解决方案3】:

对于 Outer 的每个实例化都是唯一的。即,

Outer<int>::Inner will be a different type from Outer<double>::Inner

【讨论】:

  • 这一事实对于 OP 来说是众所周知的,因为他在他的问题中已经清楚地说明了这一点
猜你喜欢
  • 2019-09-23
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2015-11-14
相关资源
最近更新 更多