incomplete-type相关内容
在C89标准中,我找到以下部分: 3.2.2.1 L值和功能指示符 除非它是sizeof运算符、一元&;运算符、++运算符、--运算符或的左操作数的操作数。运算符或赋值运算符,则不具有数组类型的左值将转换为存储在指定对象中的值(不再是左值)。如果左值具有限定类型,则该值具有左值类型的非限定版本;否则,该值具有左值类型。如果左值的类型不完整并且没有数组类型,则行为未定义。 如果我
..
请考虑结构A具有u类型的U和默认初始值设定项。析构函数~U仅声明为: template struct U { ~U(); }; struct R; struct A { U u = U{}; }; 所有编译器都接受此代码,demo:https://gcc.godbolt.org/z/oqMjTovMo 但如果我们按
..
我有两个类(或者更好的是,头文件)是我的C++程序的一部分,我就是不能让它们全部工作!他们基本上需要彼此的数据才能正常运行,作为我的应用程序的一部分。 不要通过阅读此代码的要点来折磨自己;我只需要解决转发声明和相互包含问题,因此只查看与此问题有关的代码部分。 错误出现在最后的第二个代码片段中(我不得不从第一个代码片段中砍掉一大块代码,这样我才能发布问题,我想这与我的问题无关)。
..
我有一个类应该有同一个类的私有成员,例如: class A {私人的:成员;} 但它告诉我成员是一个不完整的类型.为什么?如果我使用指针,它不会告诉我不完整的类型,但我宁愿不使用指针.任何帮助表示赞赏 解决方案 在你声明你的成员时,你还在定义 A 类,所以类型A 仍未定义. 然而,当你写A*时,编译器已经知道A代表一个类名,所以“指向A的指针"的类型是定义.这就是为什么您可以嵌入
..
所以,出乎意料地,编译器决定把这个吐出来:“现场客户的类型不完整". 以下是相关代码片段: customer.c #include #include #include "customer.h"结构客户结构;typedef struct CustomerStruct{字符 ID[8];字符名称[30];字符姓氏[30];字符地址[100];} 顾客 ;/* 处理这里结构的函数 */
..
我很惊讶在各种采样版本的 g++ 上,以下编译没有错误或警告: //改编自 boost::checked_delete()模板内联无效 assert_complete(){typedef char type_must_be_complete[ sizeof(T) ?1 : -1 ];(无效)sizeof(type_must_be_complete);}X级;无效 f(){assert_compl
..
到底为什么下面这段代码有效? struct A {std::vector子作为;}; A 是不完整的类型,对吧?如果有 A*s 的向量,我会理解.但在这里我不明白它是如何工作的.这似乎是一个递归定义. 解决方案 这个 paper 被引入 C++17 允许在某些 STL 容器中使用不完整的类型.在此之前,它是未定义的行为.引用论文: 基于 Issaquah 会议的讨论,我们实现了共
..
有时实例化具有不完整类型的标准容器以获得递归结构是有用的: struct multi_tree_node {//在大多数实现中都有效std::vector下一个;}; 这往往有效,因为容器没有 value_type 类型的成员或按值传递或返回任何 value_type 对象的成员函数.标准似乎并没有对不完整的模板参数说太多,但在 C++11 §17.6.4.8 [lib.res.on.func
..
为什么 C++ 不允许实例化不完整类型的容器? 当然可能编写没有此限制的容器 -- boost::container 完全有能力做到这一点.据我所知,它似乎没有提供任何性能或其他类型的增益,但标准声明它是未定义的行为. 例如,它确实阻止构建递归数据结构. 为什么 C++ 标准会强加这种任意限制?尽可能允许不完整类型作为模板参数有什么缺点? 解决方案 C++ 标准化委员会图
..
我已经声明了一个 struct,并且我尝试将这些结构的数组(以及一个双精度数组和一个整数的 double 数组)传递给一个函数.我在编译时从 gcc 收到 “数组类型具有不完整的元素类型" 消息.将 struct 传递给函数的方式有什么问题? typedef struct graph_node {整数 X;输入 Y;活动;} g_node;void print_graph(g_node grap
..
以下行给了我错误: 不兼容的类型.列表>output = new ArrayList>(); 是什么原因? 编辑 我知道如果我将第二个 ArrayList 更改为 List,它不会给我错误.我想知道错误的原因.谢谢 解决方案 如果你有一个 List> 那么你就可以添加一个 LinkedList 到它.但是你不能对 ArrayList> 这样做,所以后者不可能是 List>
..
我遇到了与此处所述相同的问题 无法分配具有前向声明值的类std::map 成员变量 在我们的代码库中. 然而,我还发现我们的编译器(MSVC 2017)能够编译它的其他情况... 在摆弄代码之后,我发现定义 con- &cpp 中的析构函数允许文件编译. 在 test.h 中: #ifndef TEST_H#define TEST_H#include 结构不完整;类测试{std
..
尽管我在 C++ 中看到了很多关于“不允许的不完整类型"错误的问题,但我仍然无法弄清楚编译器在像这样对我尖叫时试图告诉我什么.我已经能够拼凑起来,它与 #include-ing 头文件有关,但我对“不完整类型"是什么以及为什么“不允许"一无所知.尝试从 SDL_Window 继承时出现错误: #pragma once#include "SDL.h"类窗口:公共 SDL_Window{上市:窗户(
..
a[][3] 声明如何正确,而 a[3][] 在 C 中是错误的? 解决方案 您可以为不完整类型的对象声明标识符.例如,考虑以下声明: extern int a[][3]; 这告诉编译器,当使用a 时,它指的是一个由三个int 组成的数组.如果使用它,则必须在其他地方定义该数组.但是,要使用这个数组,编译器不需要知道它的大小.如果a有起始地址x且int是四个字节,我们可以计算元素a[i
..
给出不完整的类型: struct S; 那么以下声明是: S * p;//可以,允许使用指向不完整类型的指针std :: dequel;//错误,实例化具有不完整类型的std :: deque是UB 但是下面的声明呢? std :: deque* p;//好像是前一种情况,是UB,//但是如果在定义S之前不使用p可以吗?std :: deque;//
..
最近,当我尝试优化自己的包含层次结构时,偶然发现文件 a.hpp : templateA级{使用t =类型名T :: a_t;};B级;外部模板类A B; 这似乎是错误的形式.实际上,似乎最后一个extern模板语句会导致 A 的实例化,这会导致编译器抱怨类型不完整. 我的目标是在 a.cpp 中定义 A : #include模
..
我已经实现了UICollectionViewCell的子类,我正在使用该子类在UICollectionViewController中创建单元格.现在,当我收集一个细胞时,为了对其进行处理,我会收到一条警告Incompatible pointer types initializing 'SPCell *' with an expression of type 'UICollectionViewCel
..
我知道我们无法定义以不完整类型为参数的函数,因此可以预期以下代码因错误 C2027而无法编译:使用未定义类型'衍生' class Derived; class Base{ public: void test(Derived d){ cout
..
我有一个非常基本的反射实现,其中包括一个Type类,该类对其所描述的类进行对象实例化.剥离到相关部分,看起来像这样: Type.h: class Plugin; // forward declaration typedef std::unique_ptr PluginPtr; namespace Reflection { class Type {
..
cycle定义中的递归在哪里中断? #include using namespace std; template struct Recursive { using cycle = struct X : Recursive {}; // would work for Recursive as well }; int main
..