前向声明和强制转换不完整类型 C++
forward declaration and Cast incomplete type C++
我有关于前向声明的问题。
namespace downloader {
class IHttpThreadCallback ;
class MemoryHttpRequest ;
}
当我选角时
auto responseHttpRequest = dynamic_cast<downloader::MemoryHttpRequest*>(m_callback);
它显示警告不完整类型。我应该怎么尝试,请向我建议。
除此之外,我尝试包括类,但它不起作用,我认为这不是一个好主意。谢谢
它显示警告不完整类型。我应该如何尝试,请向我建议。
要使用 dynamic_cast
,类型必须是完整的。解决方案:包括定义。
除此之外,我尝试包括类,但它不起作用,我认为这不是一个好主意。
包含类定义不仅是一个好主意,而且如果您需要使用 dynamic_cast
,则必须这样做。在这种情况下,使用前向声明不能解决问题。
在我的情况下,我需要的类是.cpp文件中定义的
在这种情况下,不能向下转换为该类型 - 除非将类定义移动到包含的标头中。
dynamic_cast使用 vtable 查询和导航类层次结构。 它还需要知道类内容/布局才能计算偏移量。 这就是编译器需要知道类定义的原因。 static_cast需要在类之间建立关系。
如果您确定返回值并且乐于避免运行时/类型检查,则可以考虑使用 reinterpret_cast。
否则,您将需要包含定义。
我举了一个例子
#include <iostream>
#include <vector>
#include <iostream>
namespace n {
class A;
class B;
n::A* f();
}
std::ostream& operator<<(std::ostream& os, n::A& a);
std::ostream& operator<<(std::ostream& os, n::B& b);
int main()
{
n::A* a(n::f());
n::B* b=reinterpret_cast<n::B*>(n::f());
std::cerr << "a: " << *a << std::endl;
std::cerr << "b: " << *b << std::endl;
}
namespace n {
class A
{};
class B: public A
{};
n::A* f() {
return new A();
}
}
std::ostream& operator<<(std::ostream& os, n::A& a) {
os << "in A";
return os;
}
std::ostream& operator<<(std::ostream& os, n::B& b) {
os << "in B";
return os;
}
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型