我无法理解,为什么如果我们在头文件中定义普通(非模板)类的静态变量,我们有链接器错误,但是在模板的情况下一切正常,而且我们将在所有翻译单元中有单个静态变量实例:
它是模板头(template.h):
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
Run Code Online (Sandbox Code Playgroud)
它是第一个使用模板的单元(unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
Run Code Online (Sandbox Code Playgroud)
这里的第二个单位(unit2.cpp):
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
Run Code Online (Sandbox Code Playgroud)
最后,main.cpp:
// main.cpp
#include <iostream>
int method1();
int method2();
int main(int argc, char** argv) {
std::cout << method1() << std::endl;
std::cout << method2() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在编译,链接和执行此代码后,我们将得到以下输出:
0
1
Run Code Online (Sandbox Code Playgroud)
那么,为什么在模板的情况下一切正常(和预期一样)?编译器或链接器如何处理它(我们可以在分离的编译器调用中编译每个.cpp文件,然后将它们与caling链接到链接器,因此编译器和链接器不会同时"看到"所有.cpp文件)?
PS:我的编译器:msvcpp 9(但也检查了mingw)
您使用什么日志工具?Qt?
你选择qDebug(),qWarning(),qCritical(),qFatal()方法,还是像Log4cpp(Log4cplus等),或者一些自定义代码?
Qt中有串口设施吗?
如果没有,你建议使用哪个跨平台(理想)库(用于处理串口,可能还有其他I/O端口)?
我有下一个情况:我需要在独立静态库中创建小部件,然后将其与最终应用程序链接(visual c ++ 9.0,qt 4.5).此静态窗口小部件库包含一些资源(图标),并包含多个.cpp文件(每个文件包含独立窗口小部件).据我所知,我必须初始化qt资源系统,如果我在静态库中使用它们(资源),调用"Q_INIT_RESOURCE(resource_file_name)".我用下一个代码(在静态库中的每个.cpp文件中)解决了这个问题:
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
// ... widget code ....
我没有使用第一种方法,而是使用初始化代码在静态库项目中创建了单独的init.cpp文件(以避免在每个.cpp文件中包含初始化代码),但这不起作用.
为什么这不起作用?
这种使用StaticLibInitializer的方法在各种编译器和平台之间是否安全且可移植?
如何为堆栈分配的对象调用shared_from_this?在基类列表中的enable_shared_from_this是派生类的用户的指示器,用于仅在堆上创建它(我们只是希望正确的类使用)或者我们可以对这些错误有更强的保护吗?或者我不明白一些时刻?
示例代码:
__CODE__
返回COUNT个查询?
那么.. foo的精确运行时类型是什么?
class C : public enable_shared_from_this<C> { public: shared_ptr<C> method() { shared_from_this(); } };Run Code Online (Sandbox Code Playgroud)void func() { C c; shared_ptr<C> ptr = c.method(); // exception comming from shared_from_this() }
根据D docs(http://www.digitalmars.com/d/2.0/attribute.html#ProtectionAttribute),受保护的模块成员是非法的,但编译器允许我这样做.
module foo;
protected
{
int bar;
}
这是文档中的错误,编译器错误还是我做错了什么?
实际上这不是文档和现实之间唯一的不一致,所以这个参考(http://www.digitalmars.com/d/2.0)是实际的吗?是否存在更多实际的语言描述?
我的配置:dmd 2.047,OS Windows 7,x86
我必须将struct Data数组写入硬盘:
struct Data {
char cmember;
/* padding bytes */
int imember;
};
AFAIK,大多数编译器会在数据的cmember和imember成员之间添加一些填充字节,但我想保存仅存档实际数据(没有填充).
我有下一个用于保存Datas数组的代码(在缓冲区而不是文件中进行简化):
bool saveData(Data* data, int dataLen, char* targetBuff, int buffLen)
{
int actualLen = sizeof(char) + sizeof(int); // this code force us to know internal
// representation of Data structure
int actualTotalLen = dataLen * actualLen;
if(actualTotalLen > buffLen) {
return false;
}
for(int i = 0; i < dataLen; i++) {
memcpy(targetBuff, &data[i].cmember, sizeof(char));
targetBuff += sizeof(char);
memcpy(targetBuff, &data[i].imember, sizeof(int));
targetBuff += sizeof(int);
}
return …
Run Code Online (Sandbox Code Playgroud) 如何访问QTabWidget的QTabBar?
我发现的唯一解决方案是子类化QTabWidget
并覆盖受保护QTabWidget::getTabBar()
的公共.有没有其他方法这样做?