【发布时间】:2012-06-16 13:53:01
【问题描述】:
以下代码无法在 Ideone 或 Codepad 上编译,产生如下错误:
'X' 未在此范围内声明
但在 VC++ 2010 上可以:
#include <iostream>
#include <typeinfo>
template<typename T>
struct Base
{
typedef T X;
};
template<typename T>
struct Derived
:
Base<T>
{
static void print()
{
std::cout << typeid(X).name() << "\n";
}
};
int main()
{
Derived<int>::print();
Derived<char>::print();
Derived<float>::print();
return 0;
}
在哪里打印int、char 和float。我应该将代码更改为:
template<typename T>
struct Derived
{
typedef Base<T> B;
static void print()
{
std::cout << typeid(typename B::X).name() << "\n";
}
};
为了符合标准?
【问题讨论】:
-
你的意思是在第二个例子中放弃继承吗?
-
@juanchopanza 是的,我的意思是放弃它,因为该示例来自一个真实项目,其中
Base依赖于更多模板参数,因此内部typedef使代码更多一点可读。可读性实际上是我在 MSVC++ 中尝试继承但在 g++ 上失败的原因。 -
与this question的答案相同。
标签: c++ templates base-class class-members name-lookup