草庐IT

用不完

全部标签

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

c++ - shared_ptr 析构函数、复制和不完整类型

我有一个头文件foo.h像这样(省略不相关的东西):#pragmaonce#includeclassBar;structFoo{std::shared_ptrgetBar();std::shared_ptrgetBar()const{returnconst_cast(this)->getBar();}};getBar()的非常量重载在.cpp文件中实现,该文件还可以看到Bar的完整定义.当foo.h包含在另一个文件中(没有看到Bar的定义),VS2010给我这样的警告:warningC4150:deletionofpointertoincompletetype'Bar';nodestr

c++ - CRTP -- 访问不完整的类型成员

相关问题:one,twoCRTP搞了几天,现在好像比以前懂的还少:)考虑以下代码:#includetemplateclassInterace{public:typedeftypenameIMPL::TYPETYPE;//ERROR:"...invaliduseofincompletetype..."voidfoo(){IMPL::impl();}//thenwhydoesthiswork?};classImplementation:publicInterface{public:typedefintTYPE;staticvoidimpl(){std::cout问题是:为什么我可以从IMP

c++ - 不完整类型的无效使用 (SFINAE)

我正在尝试在模板化结构中使用一些SFINAE。我将我的问题简化为以下内容并且可以完成这项工作:templatestructtest{voidmyfunc();};templatevoidtest::myfunc(){std::coutvoidtest::myfunc(){std::coutfoo;testbar;foo.myfunc();bar.myfunc();}使用这段代码,我得到了结果:testtruetestfalse但是,如果我想考虑我的structtest有多个模板参数,我尝试像这样调整上面的内容:templatestructtest{voidmyfunc();};temp

c++ - 代码在 g++ 中运行完美,但在 Xcode 中运行不完美 - 找不到文件

我创建了一个包含内容的文本文件。它位于与cpp文件相同的文件夹中。我已经多次确认该文件存在。当我运行g++时,编译并运行它会找到该文件。当我在Xcode中运行它时,它不起作用。如果找不到文件。#include#include#includeusingnamespacestd;intmain(){stringline;ifstreammyfile("example.txt");if(myfile.is_open()){while(myfile.good()){getline(myfile,line);cout 最佳答案 您的文件无法打

c++ - 不完整类型内存泄漏?

MicrosoftVisualStudio2008给我以下警告:警告C4150:删除指向不完整类型“GLCM::Component”的指针;没有调用析构函数这可能是因为我在几个地方定义了Handles以转发声明的类型,所以现在Handle类声称它不会调用给定对象的析构函数。我正在运行VLD,但没有看到任何泄漏。这是字面上没有调用此对象的析构函数,还是“不能调用对象的析构函数”警告?我又问了一个内存泄漏问题,哈哈。 最佳答案 根据C++标准(ISO/IEC14882:20035.3.5/5):Iftheobjectbeingdelet

c++ - 尝试创建指针数组时不允许使用不完整的类型

我创建了2个类,Branch和Account,我希望我的Branch类有一个Account指针数组,但我没能做到。它说“不允许不完整的类型”。我的代码有什么问题?#include#include"Account.h"usingnamespacestd;classBranch{/*--------------------publicvariables--------------*/public:Branch(intid,stringname);Branch(Branch&br);~Branch();Account*ownedAccounts[];//erroratthislinestri