0

以下のコードは、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;
    }

それが印刷される場所intcharおよびfloat。コードを次のように変更する必要があります。

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

規格に準拠するには?

4

2 に答える 2

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 では、メインはicおよびを生成しますf

于 2012-06-16T15:04:45.573 に答える
-1

$ g ++ -Wall test.cpp
test.cpp:静的メンバー関数'static void Derived :: print()':
test.cpp:15:37:エラー:'X'はこのスコープで宣言されていません

$ g ++ --version
g ++(SUSE Linux)4.6.2

于 2012-06-16T14:03:27.513 に答える