从模板基类派生时未找到类型

时间:2013-03-06 00:36:26

标签: c++ templates inheritance compiler-errors type-deduction

我很难理解为什么以下两段代码存在差异,编译器究竟在做什么。

我有以下一些简单的代码,编译没有任何预期的问题:

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 ++编译器如何编译代码的模板版本,它与编译原始示例的不同之处,这是一个与代码的多次传递有关的问题,并且类型依赖查找?

1 个答案:

答案 0 :(得分:2)

在第二个版本中,booboo依赖名称,因此它不会在模板中自动显示。您可以将using typename base<T>::booboo;添加到派生类,也可以使用typedef解决方案,或者说typename base<T>::booboo bb = T(1);