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

Type not found when derived from template base class

本文关键字:找不到 类型 派生 基类      更新时间:2023-10-16

我很难理解为什么下面两段代码有区别,编译器到底在做什么。

我有以下一些琐碎的代码,编译时没有任何问题:

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

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

相关文章: