从模板基类派生时找不到类型
Type not found when derived from template base class
我很难理解为什么下面两段代码有区别,编译器到底在做什么。
我有以下一些琐碎的代码,编译时没有任何问题:
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);
。
相关文章:
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- C++ 模板:重载时找不到基类类型参数方法
- 错误 C2679:二进制'<<':找不到采用类型 'overloaded-function' 的右侧操作数的运算符(或者没有可接受的转换)
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- <<找不到运算符,尽管定义了 Foo 类型的右操作数,但该运算符仍采用类型为 Foo 的右侧操作数
- 为什么派生类找不到基类的类型别名?
- 错误 C2679:二进制'>':找不到采用类型 'int' 的右侧操作数的运算符(或者没有可接受的转换)
- 我收到错误"变量类型不完整"无效,我找不到问题所在
- OGRE-找不到请求的发射极类型.在promentystemmanager中:: _ create -emitter
- TypeError:找不到C++类型的to_python(按值)转换器
- 简单,但找不到:使用类型类的 STL 队列的成员变量的语法
- C++找不到类型定义
- 如果 JVM 的参数是从其他类型的转换而来的,JNI 找不到该类
- 找不到运算符<对于指针类型
- 程序总是返回二进制'>>':找不到运算符,它采用错误类型的左操作数
- 错误 C2678:二进制">>":找不到采用类型为"std::basic_istream<_Elem,_Traits>"的左操作数的运算符
- 错误 C2678:二进制">>":找不到采用类型为"std::stringstream "的左操作数的运算符
- 错误 C2679。错误 1 错误 C2679:二进制'<<':找不到采用类型 'std::vector<_Ty>' 的右侧操作数的运算符
- 从模板基类派生时找不到类型
- 当调用不在函数内时出现"找不到类型"错误