小编cyb*_*vnm的帖子

模板静态变量

我无法理解,为什么如果我们在头文件中定义普通(非模板)类的静态变量,我们有链接器错误,但是在模板的情况下一切正常,而且我们将在所有翻译单元中有单个静态变量实例:

它是模板头(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)

c++ static templates

59
推荐指数
1
解决办法
5万
查看次数

伐木设施和Qt

您使用什么日志工具?Qt?

你选择qDebug(),qWarning(),qCritical(),qFatal()方法,还是像Log4cpp(Log4cplus等),或者一些自定义代码?

c++ logging qt

22
推荐指数
4
解决办法
3万
查看次数

Qt和串口编程

Qt中有串口设施吗?

如果没有,你建议使用哪个跨平台(理想)库(用于处理串口,可能还有其他I/O端口)?

c++ qt qtserialport

14
推荐指数
2
解决办法
3万
查看次数

初始化静态库中嵌入的qt资源

我有下一个情况:我需要在独立静态库中创建小部件,然后将其与最终应用程序链接(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的方法在各种编译器和平台之间是否安全且可移植?

c++ qt static-libraries static-order-fiasco

13
推荐指数
2
解决办法
1万
查看次数

enable_shared_from_this和堆栈上的对象

如何为堆栈分配的对象调用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(); }
};

void func() { C c; shared_ptr<C> ptr = c.method(); // exception comming from shared_from_this() }

Run Code Online (Sandbox Code Playgroud)

c++ boost smart-pointers

10
推荐指数
1
解决办法
2585
查看次数

受保护的模块成员

根据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

d

5
推荐指数
1
解决办法
144
查看次数

struct的成员的实际总大小

我必须将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)

c c++ data-structures

3
推荐指数
1
解决办法
1452
查看次数

访问QTabBar实例

如何访问QTabWidgetQTabBar

我发现的唯一解决方案是子类化QTabWidget并覆盖受保护QTabWidget::getTabBar()的公共.有没有其他方法这样做?

c++ qt qt4

2
推荐指数
1
解决办法
2529
查看次数