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’