【发布时间】: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<T>::t1。我没有,而且我更高兴使用typename Test2::t1。谢谢。 -
@GB:是的,你选择哪一个并不重要,但是因为你不需要所谓的 injected class-name 的模板参数(
Test2这里只是扩展为Test2<T>),我更喜欢那个。 -
@Xeo 第二个示例中
Test2中的t1不是 依赖名称。依赖名称在模板实例化时解析,非依赖名称在模板解析时解析。这里的整个问题是 OP 期望t1是依赖的,而实际上并非如此。
标签: c++ templates inheritance alias