以下代码无法在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";
}
};
为了符合标准?
答案 0 :(得分:1)
如果你的意思相当于(注意你已经放弃了你的例子中的继承):
template<typename T>
struct Derived : Base<T> {
static void print() {
std::cout << typeid(typename Base<T>::X).name() << "\n";
}
};
然后是的,这是符合标准的代码。但请注意typeid(some type).name()
的结果取决于实现。在GCC上,您的主要作品i
,c
和f
。
答案 1 :(得分:-1)
$ g ++ -Wall test.cpp
test.cpp:在静态成员函数中'static void Derived :: print()':
test.cpp:15:37:错误:在此范围内未声明'X'
$ g ++ --version
g ++(SUSE Linux)4.6.2