我正在阅读C++编程语言,第4版(由Bjarne Stroustrup撰写)关于参数依赖查找.这是引用(26.3.6,Overaggressive ADL):
依赖于参数的查找(通常称为ADL)对于避免冗长非常有用(14.2.4).例如:
Run Code Online (Sandbox Code Playgroud)#include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL }
如果没有依赖于参数的查找,则
endl
无法找到操纵器.实际上,编译器注意到第一个参数<<
是ostream
定义的std
.因此,寻找endl
在std
和发现它(中<iostream>
).
这是编译器产生的结果(C++ 11模式):
prog.cpp: In function ‘int main()’:
prog.cpp:4:36: error: ‘endl’ was not declared in this scope
std::cout << "Hello, world" << endl;
^
Run Code Online (Sandbox Code Playgroud)
这是编译器或书中的错误.标准说什么?
更新:
我需要澄清一下.我知道正确的答案是使用std::endl
.问题是关于书中的文字.正如Lachlan Easton所说,这不仅仅是一个错字.整段是(可能)错了.如果这本书是由另一位(鲜为人知的)作者写的,我可以接受这种错误,但我(并且仍然)怀疑,因为它是由Bjarne写的.
我的应用需要动态调用图.我用callgrind
工具(valgrind
套件)运行它并得到callgrind.out.xxxxx
文件.现在,我想对这些数据进行图形表示.KCacheGrind
对我没什么帮助,因为它绘制了图形的有限部分(绘制~50个函数而不是〜1500个轮廓,我不知道如何修复它).如何获得将绘制所有函数的图形图像?
我尝试从这样的指定行中删除小部件QGridLayout
:
void delete_grid_row(QGridLayout *layout, int row)
{
if (!layout || row < 0) return;
for (int i = 0; i < layout->columnCount(); ++i) {
QLayoutItem* item = layout->itemAtPosition(row, i);
if (!item) continue;
if (item->widget()) {
layout->removeWidget(item->widget());
} else {
layout->removeItem(item);
}
delete item;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用它时,应用程序delete item
在第一次迭代中与SIGSEGV崩溃.有任何想法吗?
我使用Visual Studio 2010 C#编写了一个类库来读取计算机的硬件信息(例如HDD/SSD).我将使用此dll创建一个使用InnoSetup的安装程序来读取目标计算机的硬件信息.现在我的问题是.NET dll不能直接使用,除非它已经注册.我试图在InnoSetup的InitializeSetup中找到一种注册dll的方法,这样我就可以使用dll中的函数了.这是我为安装程序编写的脚本.
function InitializeSetup(): Boolean;
var
obj: Variant;
diskPartitions: Integer;
va: String;
ErrorCode: Integer;
b: Boolean;
begin
ExtractTemporaryFile('SSHardwareChecker.dll');
RegisterServer(False, ExpandConstant('{tmp}\SSHardwareChecker.dll'), False);
obj := CreateOleObject('SSHardwareChecker.SSClass');
va := obj.GetDiskDriveInformation;
MsgBox(va, mbInformation, mb_Ok);
b:=UnregisterServer(False, ExpandConstant('{tmp}\SSHardwareChecker.dll'), False);
end;
Run Code Online (Sandbox Code Playgroud)
该功能RegisterServer
似乎不起作用RegSvr32 failed with exit code 0x4
.它会抛出一个错误.我在网上读了很多文章说.net dll应该用regasm注册.我真的不知道如何做到这一点,尤其是在Inno Setup中.
请帮帮我们
我在我的Java应用程序中实现了订阅.添加新订户时,应用程序会创建新任务(实现Runnable
在单独的线程中运行的类)并将其添加到以下内容中ExecutorService
:
public void Subscribe()
{
es_.execute(new Subscriber(this, queueName, handler));
}
//...
private ExecutorService es_;
Run Code Online (Sandbox Code Playgroud)
应用程序可以根据需要注册多个订阅者.现在我希望实现类似的东西Unsubscribe
,每个订阅者都有能力停止消息流.在这里,我需要一种方法来阻止其中一个任务运行ExecutorService
.但我不知道怎么做到这一点.
它ExecutorService.shutdown()
和它的变化不适合我:它们终止所有任务,我想终止它们中的一个.我正在寻找解决方案.尽可能简单.谢谢.
我是Java World的新手(因为我在C/C++中编写初级).我在我的应用中使用地图.由于java.util.Map
是抽象的,我需要实例化它的实现.通常我用的HashMap
是:
Map<String, MyClass> x = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
但在Java文档,我发现许多其他的实现,如TreeMap
,LinkedHashMap
,HashTable
,等我想知道我是否可以继续使用盲目的HashMap
或有任何重要的差异Map
实现.
要点的简要列表就可以了.谢谢.
现在我正在重写我的代码的一部分以使用C++ 11标准.在某些地方我发现了以下代码:
boost::shared_array<uint8_t> array;
Run Code Online (Sandbox Code Playgroud)
它是否可以替换为:
std::shared_ptr<std::vector<uint8_t>> array;
Run Code Online (Sandbox Code Playgroud)
我正在尝试替换我的代码中已经在C++ 11中提供的所有boost功能.
我需要澄清一下.实际上我需要一个原始数组(但使用refcount,因此可以自动删除),不需要所有这些矢量功能.因此boost :: shared_array解决了我想要的问题而无需任何额外费用.但是我正在努力让我的代码尽可能地使用新标准(虽然许多来自boost的库仍未被新标准所涵盖).
谢谢.
有没有办法将3056144 sec
格式转换为秒数(例如,这是时间增量而不是时间)到时间YYYY-mm-dd HH:MM:SS
?
我试图将秒数转换为struct tm
使用localtime
然后减去UNIX开始时间(1970-01-01),但这不能按预期工作.
提前致谢.
PS我必须使用C++ 03,而不是C++ 11.
我有一些非常有用的插件可以通过文件查找和替换文本(请参阅EasyGrep
vim脚本 - 这对程序员非常有帮助).我甚至可以只在当前缓冲区中替换文本 - 使用插件或:%s ...
.但是如果我只想在当前函数体中替换文本呢?
请考虑以下示例:
void f0()
{
int foo = 0;
// ...
}
// 99 other functions that uses foo as local variable.
void f100()
{
int foo = 0; // I want to replace foo with bar only in this function
// 1000 lines of code that uses foo goes below
// ...
}
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用:%s ...
具有c
标志进行确认,但我相信有一个更快的方法来做到这一点.
谢谢.