这个名称是在VC ++ 2010非标准的依赖基类中查找的吗?

时间:2012-06-16 13:53:02

标签: c++ templates base-class class-members name-lookup

以下代码无法在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;
    }

它会打印intcharfloat。我应该将代码更改为:

    template<typename T>
    struct Derived
    {
            typedef Base<T> B;
            static void print()
            {
                    std::cout << typeid(typename B::X).name() << "\n";
            }
     };

为了符合标准?

2 个答案:

答案 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上,您的主要作品icf

答案 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