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

C++ 从模板基类派生时找不到类型,c++,templates,inheritance,compiler-errors,type-deduction,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(); re

我很难理解为什么下面两段代码会有差异,编译器到底在做什么

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

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;
}
模板
阶级基础
{
公众:
类型定义T booboo;
};
模板
派生类:公共基
{
公众:

//typedef typename base::boobooboo;在第二个版本中,
booboo
是一个从属名称,因此它在模板中不会自动可见。您可以使用typename base::booboo;
添加到派生类中,或者使用您的typedef解决方案,或者说
typename base::booboo bb=T(1)

把你遇到的错误作为你问题的一部分总是值得的。@JBentley:很抱歉,我现在要更新这个问题。只是为了澄清一下,这意味着在一开始编译器不能保证基类模板的专门化没有省略
bo的定义oboo
,或者可能将
boobooboo
定义为函数或任何东西。因此,必须告诉编译器关于名称的假设:它来自基类,并且是一个类型。@Kerrek:您是否知道标准中描述/谈论处理模板时类型何时可见的部分?或者一个实现定义的问题?@SamiKenjat:14.6.2,“依赖名称”,在C++11中。基本上是
右边的任何名称,如果左边是模板专用化。这包括方法吗?我相信有时需要使用“模板”这个词当从同样被模板化的类调用模板方法时。@SamiKenjat:模板名称需要说
template
,类型名称需要说
typename
,值类名称不需要说任何内容。
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’