草庐IT

用不完

全部标签

c++ - 指向不完整类型数据成员的指针

以下代码在C++中是否定义明确?(*)我很难弄清楚该从哪里看标准,而且在网络上搜索也没有找到任何具体的内容。structS;structT{constexprT()=default;boolS::*a=nullptr;intb=42;};constTt{};//Test.Compiledusing:cl/W4/WX/FAsfilename.cpp#includeintmain(){if(t.b!=42)abort();}我问的原因是因为它适用于(或似乎适用于)较新版本的GCC和Clang(x86/x86_64),但在VisualStudio2015Update2和Update3RC中失

c++ - 聚合 ‘BIGNUM foo’ 类型不完整,无法定义

我尝试编译opendcp,但发生错误。$make...[10%]BuildingCXXobjectlibasdcp/CMakeFiles/opendcp-asdcp.dir/KM_prng.cpp.o/home/jwel/opendcp/libasdcp/KM_prng.cpp:Infunction‘voidKumu::Gen_FIPS_186_Value(constbyte_t*,ui32_t,byte_t*,ui32_t)’:/home/jwel/opendcp/libasdcp/KM_prng.cpp:219:10:error:aggregate‘BIGNUMc_2powb’ha

c++ - 为什么 std::vector 使用类定义中的不完整类型?

下面的问题出现了:C++标准似乎说,std::vector需要一个完整的类型才能工作。(参见https://en.cppreference.com/w/cpp/container/vector)那么,为什么下面的代码仍然可以编译?#includestructparent;structchild{std::vectorparents;//parentisincompletehere!};structparent{std::vectorchildren;};这似乎违反直觉。如果std::vector需要一个完整的类型,然后std::vector不应编译,因为在child的类定义中只有它的前

c++ - 可变参数模板 - 不完整类型

有这个代码:templatestructAre_Same{enum{value=Are_Same::value};};templatestructAre_Same{enum{value=Are_Same::value};//HEREisTHEERROREOUSLINE};templatestructAre_Same{enum{value=std::is_same::value};};我从gcc4.6.1得到错误:error:incompletetype'Are_Same'usedinnestednamespecifier.我认为通过做Are_Same::value我将调用递归调用,最后

c++ - 带有 std::tuple 数组的 std::array 不完整类型错误

我在使用C++11时遇到了一些奇怪的行为std::array.当我尝试使用std::array,6>myTuples;进行编译时作为成员变量,我得到这些错误:mingw32\4.7.2\include\c++\array:-1:Ininstantiationof'structstd::array,6u>':mingw32\4.7.2\include\c++\array:77:error:'std::array::_M_instance'hasincompletetype我不确定这是否有任何改变,但它所在的类是从另一个模板类派生的模板类。模板参数是unsignedintan确定prote

c++ - 在类模板的成员函数中使用不完整类型

GCC(8.3、9.1)、Clang(7、8)和MSVC(19.20)的不同之处在于它们编译此代码的能力:structC;templatestructS{voidfoo(){//C2c;Cc;}};classC{};intmain(){Ss;s.foo();return0;}GCC和MSVC接受它,而Clang拒绝它。即使我将foo本身作为模板和/或根本不调用它,Clang也会拒绝它。我的理解是,foo除非被调用,否则不会被实例化,而是在被调用的地方被实例化。到那时,C就完成了,代码应该可以编译了。这是GCC的推理吗?作为旁注,如果未调用foo,即使我将C替换为未声明的C2,MSVC也

c++ - 删除指向不完整类型的指针 'Point' ;没有调用析构函数

我有2个文件:Point.h:classPoint{intx;inty;char*name;public:Point(){name=newchar[5];}~Point(){delete[]name;}};和:Line.h:classPoint;classLine{Point*p;public:Line(){p=newPoint[2];.......}~Line(){delete[]p;}};但是当我编译时,我得到了下一个错误:deletionofpointertoincompletetype'Point';nodestructorcalled感谢任何帮助!

c++ - 使用不完整类型参数化的模板的外部模板

一个可编译的例子:main.cpp#include"test.h"intmain(intargc,char*argv[]){automyPtr=std::unique_ptr(getMyPtr());}测试.h#ifndefTEST_H#defineTEST_H#includeclassMyClass;externtemplateclassstd::unique_ptr;MyClass*getMyPtr();#endif测试.cpp#include"test.h"classMyClass{};templateclassstd::unique_ptr;MyClass*getMyPtr()

c++ - 具有默认成员值和不完整类型的模板扩展的编译器差异

在MSVC和Clang之间为具有默认初始化程序的类成员扩展模板时似乎有所不同,这有时会导致代码在MSVC中编译成功但在Clang中编译失败。有问题的代码相当复杂并且分布在多个文件中,但我认为以下玩具示例显示了相同的差异:#includeclassImpl;classA{std::unique_ptrptr=nullptr;public:A();~A();};intmain(){}https://godbolt.org/z/3s5Drh正如在编译器资源管理器中所见,Clang给出了此代码的错误。如果删除=nullptr,两个编译器都将正常运行。显然这段代码不会做任何事情,即使它做了,=n

c++ - 在 g++ 上无效使用不完整类型

我有两个相互依赖的类:classFoo;//forwarddeclarationtemplateclassBar{public:Foo*foo_ptr;voidDoSomething(){foo_ptr->DoSomething();}};classFoo{public:Bar*bar_ptr;voidDoSomething(){bar_ptr->DoSomething();}};当我用g++编译它时,出现“无效使用不完整类型”的错误,但它在MSVC10中编译得很好。将声明和定义保留在一个头文件中是否可以解决这个问题?(没有cpp文件)如果标准不允许这样做,那么这是MSVC的“错误”或