C++ 03的显式模板的实例化定义和C++ 11的显式模板的实例化声明之间有什么区别?
我的意思是为什么实例化定义不足以阻止编译器为其他类型生成实现?下面的例子有什么问题:想象一下我将模板声明和定义分成两个单独的文件:
啊
#pragma once
template<typename T>
class A
{
public:
A(T t);
private:
T _t;
};
Run Code Online (Sandbox Code Playgroud)
A.cpp
#include "A.h"
template<typename T>
A<T>::A(T t) : _t(t) {}
template class A<int>; // explicit instantiation
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "A.h"
int main()
{
A<int> a(5); // fine, compiler generates header file,
// linker links with implementation from A.cpp file
// A<float> b(3.14f); // linker error, as expected
}
Run Code Online (Sandbox Code Playgroud)
上面的示例中是否有任何编译时间开销?如果我理解正确,在这种情况下,在单独的*.cpp文件中使用显式实例化定义(以及模板的实现),我使编译器无法使用任何其他类型隐式实例化模板.因此,为什么显式实例化声明有单独的语法?
如果我已经使用显式实例化定义隐藏了A.cpp文件中的实现,并且阻止编译器为其他类型生成主体,那么显式实例化声明如何加快编译时间."显式实例化声明"是否与"显式实例化定义"有某种关联,我的意思是我应该同时使用它们,还是这些是完全独立的特性(例如,只有在未使用显式实例化定义时才能使用显式实例化声明)?
我是否正确,明确的实例化定义只是在没有其他翻译单元使用给定类型实例化模板的情况下触发错误?
我正在使用Ubuntu 12.04 LTS,我从这里获得了Sublime Text编辑器.... http://sublimetext.com/3
我已经google了很多,甚至在做了Alt+之后V我没有看到"显示菜单"的选项.
这是我的一部分.config/sublime-text-3/Local/Session.sublime_session:
"menu_visible": true,
"output.find_results":
{
"height": 0.0
},
Run Code Online (Sandbox Code Playgroud)
和
"distraction_free":
{
"menu_visible": true,
"show_minimap": false,
"show_open_files": false,
"show_tabs": false,
"side_bar_visible": false,
"status_bar_visible": false
},
Run Code Online (Sandbox Code Playgroud)
但我可以看到菜单栏既不是默认状态也不是无牵引模式
我不知道如何看菜单栏.顺便提一下,我有一个未注册的版本.
我使用boost :: asio :: buffer来发送消息
void Send(const std::string& messageData)
{
socket.async_write(boost::asio::buffer(messageData), ...);
}
Run Code Online (Sandbox Code Playgroud)
并在io_service线程中的某处遇到"字符串迭代器不可解除"的运行时错误.当我创建对象的变量来存储缓冲区的消息数据时:
void Send(const std::string& messageData)
{
this->tempStorage = messageData;
socket.async_write(boost::asio::buffer(this->tempStorage), ...);
}
Run Code Online (Sandbox Code Playgroud)
错误永远不会发生.几乎在Send()调用之后释放std :: string(引用了messageData) - boost :: asio :: buffer是否只存储对象的引用?如果是这样,我如何强制它按值存储数据?
我得到的警告是:" 即使工具包具有有效的工具链,Qt Cmake配置也没有到C++编译器集的路径. "
我不知道如何更改CMake配置,以便它有一个编译器的路径.我安装了一个C++编译器,因为它适用于VS但Qt似乎遇到了一些问题.
这是警告显示的屏幕截图:https://i.stack.imgur.com/ETET6.jpg
这是我试图运行任何东西的错误:
jom: C:\Users\User\Desktop\inv\build-Invaders-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug\Makefile.Debug [debug\game.obj] Error 1
'cl' is not recognized as an internal or external command,
operable program or batch file.
jom: C:\Users\User\Desktop\inv\build-Invaders-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug\Makefile.Debug [debug\spaceship.obj] Error 1
'cl' is not recognized as an internal or external command,
operable program or batch file.
jom: C:\Users\User\Desktop\inv\build-Invaders-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug\Makefile.Debug [debug\laserbeam.obj] Error 1
'cl' is not recognized as an internal or external command,
operable program or batch file.
'cl' is not recognized as an internal or external command, …Run Code Online (Sandbox Code Playgroud) 我在终端中有一个可用的 GStreamer-1.0 管道,我试图在 Mac/Xcode 上使用 GStreamer 1.0 在代码中复制它。
我的发送管道:
gst-launch-1.0 videotestsrc ! videoconvert ! x264enc ! rtph264pay config-interval=1 ! udpsink host=127.0.0.1 port=5000
Run Code Online (Sandbox Code Playgroud)
我的接收管道:
gst-launch-1.0 -vvv udpsrc port=5000 caps="application/x-rtp" ! rtph264depay ! avdec_h264 ! videoconvert ! xvimagesink
Run Code Online (Sandbox Code Playgroud)
这也可以通过以下 SDP 文件在 VLC 中播放:
v=0
m=video 5000 RTP/AVP 96
c=IN IP4 127.0.0.1
a=rtpmap:96 H264/90000
Run Code Online (Sandbox Code Playgroud)
我创建了以下代码来复制上述代码,但问题是接收管道在运行此代码时不显示任何内容。该代码确实根据 Xcode 调试控制台将数据包发送到网络。
gint
main (gint argc,
gchar *argv[])
{
GstElement *pipeline, *videosrc, *conv,*enc, *pay, *udp;
// init GStreamer
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
// setup …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个Makefile以根据目标文件扩展名构建静态(.a)和动态(.so)库。
我以前仅将以下Makefile用于静态库:
NAME := config
LIB := lib$(NAME).a
SRC := $(wildcard *.c)
OBJ := $(SRC:.c=.o)
CFLAGS += -W -Wall
.PHONY: all clean fclean re
all: $(LIB)
clean:
@$(RM) $(OBJ)
fclean: clean
@$(RM) $(LIB)
re: fclean all
$(LIB): $(LIB)($(OBJ))
ranlib $@
Run Code Online (Sandbox Code Playgroud)
我的主要目标是仅通过更改LIB和NAME变量就能够编译多个库。
一切正常,因此我为动态库添加了以下内容:
LDFLAGS += -shared
%.so: CFLAGS += -fPIC
%.so: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
Run Code Online (Sandbox Code Playgroud)
并$(LIB):通过以下通用规则更改了规则:
%.a: %.a($(OBJ))
ranlib $@
Run Code Online (Sandbox Code Playgroud)
如果我更改LIB为lib$(NAME).so一切正常,但使用.a扩展名,make将显示此错误:
make: *** No rule to …
我理解填充是如何工作的.我知道对齐是什么.对我来说奇怪的是,为什么只有char字段的struct的大小不对齐到4个字节(末尾的填充)?我怀疑这不是规范所保证的,所以编译器不这样做.如果是这种情况,我可以参考这样的规则吗?我最感兴趣的是x86和x86-64架构.
例:
struct foo {
char field1;
char field2;
char field3;
} foo2;
int main(void)
{
printf("sizeof=%lu\n", sizeof foo2);
}
Run Code Online (Sandbox Code Playgroud)
输出: sizeof=3
我需要使用rapidjson稀疏这种类型的json:
{
"errors":{},
"id":2326625,
"source_code":"GOOG",
"data":
[
["2010-01-12",-0.010565362832445,-0.010432881793793,-0.010144243731464,-0.017685262281432,-0.3275071624503],
["2010-01-13",-0.036084889870791,-0.016333087890756,-0.024003268530183,-0.0057299789787753,0.33911818660036],
["2010-01-14",0.012849006806501,0.0098673018033346,0.015523616828298,0.0047058823529412,-0.34735779281787],
["2010-01-15",0.013166015223205,-0.0010781671159029,-0.0081756037236783,-0.016698910497913,0.28200124010685]
]
}
Run Code Online (Sandbox Code Playgroud)
要获得id"source_code"的值非常简单:
d.Parse<0>(json);
printf("source_code" = %s\n", document["source_code"].GetString());
但是我无法成功检索数据值.例如,我希望能够检索"2010-01-12"和"-0.010565362832445"(数据中第一个数组的第一个值).
你有什么主意吗 ?
我正在尝试编写一个带ifstream&参数的函数。
void word_transform(ifstream & infile)
{
infile("content.txt");
//etc
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
类型“ifstream”(又名“basic_ifstream”)不提供调用运算符。
你能帮我看看有什么问题吗?
是否有一种优雅的方法来检查str.find()实例方法返回的值-1 ?我发现测试-1值非常难看,但我不想说<0,因为这可能会引起混淆.
if (myString.find('foo') == -1):
print("foo not found in ", myString)
Run Code Online (Sandbox Code Playgroud)