【问题标题】:inheritance of type aliases within templates模板中类型别名的继承
【发布时间】:2013-07-28 21:34:05
【问题描述】:

看起来我是在类之间继承类型别名,但不是在类模板之间?我不明白为什么这段代码有效:

#include <iostream>

//template<typename T>
struct Test1
{
//    using t1=T;
    using t1=int;
};

//template<typename T>
struct Test2: public Test1//<T>
{
  t1 x;  
};

int main(int argc, char *argv[]) {
//    Test2<int> a;
    Test2 a;
    a.x=5;
    std::cout << a.x << std::endl;
}

而这段代码没有:

#include <iostream>

template<typename T>
struct Test1
{
    using t1=T;
};

template<typename T>
struct Test2: public Test1<T>
{
  t1 x;  
};

int main(int argc, char *argv[]) {
    Test2<int> a;
    a.x=5;
    std::cout << a.x << std::endl;
}

类型不通过模板继承吗?

【问题讨论】:

  • t1 在第二个示例中是一个依赖名称(因为它源自的基类是一个依赖于Test2 模板参数的模板) , 使用typename Test2::t1
  • @xeo,是的,你是对的,这行得通,但我想知道为什么......
  • @Xeo,做到了。我想你肯定打错了,我需要typename Test1&lt;T&gt;::t1。我没有,而且我更高兴使用typename Test2::t1。谢谢。
  • @GB:是的,你选择哪一个并不重要,但是因为你不需要所谓的 injected class-name 的模板参数( Test2 这里只是扩展为Test2&lt;T&gt;),我更喜欢那个。
  • @Xeo 第二个示例中Test2 中的t1 不是 依赖名称。依赖名称在模板实例化时解析,非依赖名称在模板解析时解析。这里的整个问题是 OP 期望 t1 是依赖的,而实际上并非如此。

标签: c++ templates inheritance alias


【解决方案1】:

以下将起作用:

 typename Test1<T>::t1 x;

而且,正如 Xeo 在上面的 cmets 中指出的那样:

typename Test2::t1 x;

【讨论】:

  • 是的,但正如@Xeo 上面指出的那样,typename Test2::t1 x 也将如此,它的优点是需要更少的打字、更少的标点符号,并保留所有与派生类相关的引用。
  • 听起来不错!但是在实现 Test2 时调用 Test2 的静态元素感觉有点违反直觉。但是,完全有效。
  • 它使继承对我来说更干净。如果我选择稍后将定义更改为struct Test2: public OtherTest&lt;T&gt;,则无需通过实现寻找依赖项。实际上,我认为如果我将类型名引用到Test1&lt;T&gt;,然后更改基类但错过了文本依赖项,我会默默地使用Test1&lt;T&gt;::t1,即使我的继承结构暗示其他情况。
  • 很酷,从结构中携带类型的好方法。现在我看到了@GB 的理由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2018-07-06
  • 1970-01-01
  • 2019-01-09
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多