我很难理解为什么在以下两段代码中存在差异,编译器究竟在做什么。从模板基类派生类型时未找到
我的琐碎以下代码位,符合市场预期,没有任何问题,编译:
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’
。
我想详细了解一个典型的C++编译器如何编译代码的模板版本,它与编译原始示例有什么不同,这是一个需要多次代码传递的问题,类型依赖查找?
发布您的问题中包含的错误总是值得的。 – JBentley 2013-03-06 00:40:57
@JBentley:对不起,现在我会更新这个问题。 – 2013-03-06 00:43:20