草庐IT

c++ - 指向类型不完整的 typedef 的指针

有什么方法可以声明一个指向不完整类型的指针,该类型将由实现中的typedef设置?这是我想要的例子:#ifndefTEST_H#defineTEST_Hnamespacestd{classstring;//THISWON'TWORK!}structTest{std::string*value;};#endifstring是basic_string的类型定义,因此示例中的代码将不起作用。我可以声明一个不完整类型的std::basic_string,但这看起来像是一种解决方法。我知道编译器不会为typedef生成符号,对于不同文件中的不同类型,可能会在typedef中使用相同的名称。但由于

c++ - 循环依赖/不完整类型

在C++中,我遇到循环依赖/不完整类型的问题。情况如下:Stuffcollection.h#include"Spritesheet.h";classStuffcollection{public:voidmyfunc(Spritesheet*spritesheet);voidmyfuncTwo();};Stuffcollection.cppvoidStuffcollection::myfunc(Spritesheet*spritesheet){unsignedintmyvar=5*spritesheet->spritevar;}voidmyfunc2(){//}Spritesheet.h

c++ - 为什么不能将不完整的类型转换为 void?

为什么下面的代码会报如下错误?为什么类型需要完整才能转换为void?structIncomplete;classClass{virtualvoidfoo(Incomplete&incomplete){(void)incomplete;throwstd::logic_error("notimplemented");}};错误:errorC2027:useofundefinedtype'Incomplete'seedeclarationof'Incomplete' 最佳答案 这是C和C++之间的变化,Microsoft以前在C++中实现

c++ - Boost Spirit 信号成功解析,尽管 token 不完整

我有一个非常简单的路径构造,我正在尝试使用boostspirit.lex进行解析。我们有以下语法:token:=[a-z]+path:=(token:path)|(token)所以我们在这里只讨论冒号分隔的小写ASCII字符串。我有三个示例“xyz”、“abc:xyz”、“abc:xyz:”。前两个应该被认为是有效的。第三个以冒号结尾,不应被视为有效。不幸的是,我的解析器认为这三个都是有效的。语法不应允许空标记,但显然spirit正在这样做。我错过了什么让第三个被拒绝?此外,如果您阅读下面的代码,在注释中有另一个版本的解析器要求所有路径以分号结尾。当我激活这些行时,我可以获得适当的行为

c++ - 字段类型不完整

我得到错误的“字段有不完整的类型”,但也不知道为什么。有人能帮忙吗?谢谢!g++-pipe-W-Wall-fopenmp-ggdb3-DDEBUG-fno-omit-frame-pointer-c-otest.o../../src/test.ccInfileincludedfrom../../src/test.cc:50:../../src/feature_haar.h:14:error:field‘_count’hasincompletetype抄袭#include"feature_count.h"#include"feature_random_counts.h"#include"f

c++ - C和C++不完全数组指针转换规则的区别

当我用gcc和g++编译以下代码时,g++给出了错误,而不是gcc。请注意,代码从int(*)[4]转换为int(*)[](这是指向不完整数组类型的指针)。intarr[4];int(*p_arr)[]=&arr;如Incompletearraytype?中所述,C语言允许这种转换。但是为什么C++不允许这样做并给出错误error:cannotconvert‘int(*)[4]’to‘int(*)[]’inassignment。我知道C++比C更类型安全,但是这个赋值真的是类型不安全的,因为后来对指针的取消引用(例如sizeof(*p_arr))无论如何都会在中给出错误C也是吗?

c++ - 外部模板和不完整类型

最近,当我试图优化我的包含层次结构时,我偶然发现了文件a.hpp:templateclassA{usingt=typenameT::a_t;};classB;externtemplateclassA;这似乎是错误的。事实上,最后的extern模板语句似乎导致了A的实例化。这会导致编译器提示类型不完整。我的目标是定义A在a.cpp:#includetemplateclassA;这样我就避免了必须包含b.hpp来自a.hpp这似乎是减少编译时间的好主意。但是它不起作用(a.hpp本身无法编译!)有更好的方法吗?注意:当然我可以不使用显式模板实例化,但这不是我想要的!我想“预编译”A如果使用

c++ - 使用 shared_ptr 处理不完整类型的 Pimpl 习语

我正在阅读ScottMeyers的EffectiveModernC++,他正在讨论pimpl习语的使用,并使用unique_ptr指向实现类,但存在特殊成员函数的问题(例如析构函数)要求类型完整。这是因为unique_ptr的默认删除器在使用deletep之前静态断言要删除的类型是否完整。因此类的任何特殊成员函数都必须在实现文件中定义(而不是由编译器生成),在实现类定义之后。在章节的最后,他提到如果使用的智能指针是shared_ptr,就不需要在实现文件中定义特殊的成员函数,这源于它支持自定义的方式删除器。引用:Thedifferenceinbehaviorbetweenstd::un

c++ - 带有 std::enable_if 和 std::is_default_constructible 的 SFINAE 用于 libc++ 中的不完整类型

我刚刚在使用SFINAE检测模板类型是否默认可构造时观察到libc++的一个奇怪问题。以下是我能够想出的一个最小示例:#include#includetemplatestructDummy;templatestructDummy{};templatestructhas_dummy:std::false_type{};templatestructhas_dummy>::value>>:std::true_type{};intmain(){std::cout{}(){}()它编译并输出预期的行true和false使用libstdc++使用g++或clang++编译时.但是,当我尝试使用li

c++ - Qt:字段类型不完整

无法编译我的类。获取错误:错误:字段“文件名”的类型不完整如果我将QStringfilename更改为QString*filename,错误就会消失。但我需要有QStringfilename。进程.h:#ifndefPROCESS_H#definePROCESS_H#includeclassProcess{public:intpid;QStringfilename;Process(intpid,QStringfilename);};#endif//PROCESS_H进程.cpp:#include"process.h"Process::Process(intpid,QStringfile