1

次の2つのコードに違いがある理由、コンパイラが正確に何をしているのかを理解するのに苦労しています。

私は次のような些細なコードを持っていますが、それは期待通りに問題なくコンパイルされます:

class base
{
public:
   typedef int booboo;
};

class derived : public base
{
public:
   int boo()
   {
      booboo bb = 1;
      return bb;
   }
};

int main()
{
   derived d;
   d.boo();
   return 0;
}

上記のコードを取得していくつかのテンプレートパラメータを追加すると、タイプboobooが無効であることに関連するエラーが発生し始めます。

template <typename T>
class base
{
public:
   typedef T booboo;
};

template <typename T>
class derived : public base<T>
{
public:
   //typedef typename base<T>::booboo booboo; <-- fixes the problem
   booboo boo()
   {
      booboo bb = T(1);
      return bb;
   }
};

int main()
{
   derived<int> d;
   d.boo();
   return 0;
}

エラー:

prog.cpp:13:4: error: ‘booboo’ does not name a type
prog.cpp:13:4: note: (perhaps ‘typename base<T>::booboo’ was intended)
prog.cpp: In function ‘int main()’:
prog.cpp:23:6: error: ‘class derived<int>’ has no member named ‘boo’

http://ideone.com/jGKYIC

典型的なc++コンパイラがコードのテンプレートバージョンをコンパイルする方法、元の例のコンパイルとの違い、これはコードの複数のパスに関係する問題であり、タイプに依存する外観について詳しく理解したいと思います- UPS?

4

1 に答える 1

3

2番目のバージョンでboobooは、は依存名であるため、テンプレートに自動的に表示されません。派生クラスに追加using typename base<T>::booboo;するか、typedefソリューションを使用するか、またはと言うことができますtypename base<T>::booboo bb = T(1);

于 2013-03-06T00:41:05.227 に答える