在我们的项目中,我们使用QtTestLib进行单元测试.原因是整个项目在可能的情况下已经使用Qt并且它是一个GUI应用程序,因此我们希望能够测试GUI界面.
我们的项目是由MSVC编译的,所以我们不希望每个测试都有一个单独的项目文件,因为它会使解决方案变得混乱.因此,我们为所有测试创建了一个项目.所有测试都应该在CIS上自动进行(持续集成),因此我们尝试使用一些XSLT转换通过XML格式的输出文件将测试插入Hudson.
但似乎测试输出存在问题.如果对所有测试使用单个main(),并且仅向每个测试传输cmd行参数:
#include "MyFirstTest.h"
#include "MySecondTest.h"
int main(int argc, char **argv)
{
int result = 0;
MyFirstTest test1;
result |= QTest::qExec(&test1, argc, argv);
MySecondTest test2;
result |= QTest::qExec(&test2, argc, argv);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后你会得到一个多次重写的结果文件.因此,如果您想使用输出文件(例如xml)稍微自动化它,您将只获得其中的最后结果.所有其他都将被覆盖.
我们已经尝试过这种方法,它不能让你使用像Hudson这样的连续集成系统.所以我的问题是:有没有机会在一个输出文件中附加结果?当然,我们可以使用一些解决方法,例如通过QTest :: qExec()运行每个测试,并使用修改后的参数将结果写入单独的文件,但这似乎不是最好的方法.理想情况下,我希望有一个结果文件与CIS一起使用.
我在Windows 7×64上使用Qt 5.0.0(个人编译 - MinGW x64).我在配置中添加了MySQL支持,并在系统上安装了MySQL.MySQL库,头文件在应用程序中可见.
程序在打开数据库时崩溃.我像这样打开数据库:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("My DB name");
db.setUserName("root");
db.setPassword("My password");
db.setHostName("localhost");
db.setPort(3306);
try{
db.open(); // <=== Crashes without throwing an exception
}
catch(std::exception e)
{
std::cout << e.what() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
笔记:
qDebug() << QSqlDatabase::drivers();
Run Code Online (Sandbox Code Playgroud)
版画
("QMYSQL3", "QMYSQL", "QODBC3", "QODBC", "QSQLITE")
Run Code Online (Sandbox Code Playgroud)
操作系统生成的问题签名如下所示:
Problem Event Name: APPCRASH
Application Name: CMS.exe
Application Version: 0.0.0.0
Application Timestamp: 51010cdd
Fault Module Name: Qt5Sql.dll
Fault Module Version: 5.0.0.0
Fault Module Timestamp: 50f6b734
Exception Code: c0000005
Exception Offset: 00000000000df950 …Run Code Online (Sandbox Code Playgroud) 我在Eclipse CDT中遇到了代码分析器错误.它与C++ 11功能不兼容.__GXX_EXPERIMENTAL_CXX0X__已定义,并设置了编译器标志.库编译并正常工作,虽然我找不到告诉Eclipse这nullptr是一个关键字的方法!请不要突出显示它.

我正在使用当前LTS Ubuntu(12.04)的默认版本.这是Indigo(3.7.2).
我正在使用autotools作为我的库的构建系统.最近,库被移植到Windows.虽然我遇到了一个奇怪的错误,但库成功编译并成功链接.配置和make后只有静态库.除了以下警告之外,Evertything看起来还不错libtool:
libtool: undefined symbols not allowed in i686-pc-mingw32 shared
Run Code Online (Sandbox Code Playgroud)
我通过以下代码导出了Windows机器的所有符号:
#ifdef _WIN32
# ifdef DLL_EXPORT
# define LIBRARY_API __declspec(dllexport)
# else
# define LIBRARY_API __declspec(dllimport)
# endif
#endif
#ifndef _WIN32
# define LIBRARY_API
#endif
Run Code Online (Sandbox Code Playgroud)
在我的每一个定义中:
class LIBRARY_API myClass {
// ...
Run Code Online (Sandbox Code Playgroud)
注:
操作系统:Windows 8 x86_64
编译器套件:MinGW x86_64,MSYS x86
我需要将一个字符串作为定义传递给我的源代码,这是一个base64编码的字符串(因此可能包含/和").我正在使用qmake和g ++.我尝试过这么多组合,但都不起作用:
qmake DEFINES+=SERIAL=\\\"f9a/z\\\"
qmake DEFINES+=SERIAL=\"f9a/z\"
qmake DEFINES+="SERIAL=\\"f9a/z\\\""
Run Code Online (Sandbox Code Playgroud)
G ++应该得到这样的序列:
g++ -DSERIAL=\"f9a/z\"
Run Code Online (Sandbox Code Playgroud) 在尝试生成给定字符集的所有可能字符串时,我遇到了困难.让我们S设置符号.我需要处理所有可能的S长度组合n.例如,如果S={'a','b','+','-'}和n=4算法应该处理以下序列:
aaaa
aaab
abab
+aa-
// And all other sequences in the universe
Run Code Online (Sandbox Code Playgroud)
目前我的算法是下面描述的非有效递归算法.我有两个问题:
当前实施:(简化)
void workhorse(vector<char> &input, vector<char>::iterator i)
{
if(i==inputs.end()) {
// process the input
return;
}
else {
for( const auto& symbol : S) {
*i=symbol;
workhorse(input, i+1);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个八度的大矩阵,需要将其数据导入到我的C ++代码中。矩阵是所有数字,我想将其另存为C数组在头文件中。
例如:
> # octave:
results =
-3.3408e+01 -5.0227e+00 4.3760e+01 3.2487e+01 1.0167e+01 4.1076e+01 6.3226e+00 -3.7095e+01 1.3318e+01 3.8582e+01
-2.1087e+01 -6.1606e+00 4.8704e+01 3.1324e+01 3.0287e+01 4.0114e+01 1.5457e+01 -3.6283e+01 2.6035e+01 4.0112e+01
Run Code Online (Sandbox Code Playgroud)
所需的输出:
/* In some foo.h */
static const float results = {
3.3408e+01,-5.0227e+00,4.3760e+01,3.2487e+01,1.0167e+01,4.1076e+01,6.3226e+00,-3.7095e+01,1.3318e+01,3.8582e+01,
2.1087e+01,-6.1606e+00,4.8704e+01,3.1324e+01,3.0287e+01,4.0114e+01,1.5457e+01,-3.6283e+01,2.6035e+01,4.0112e+01,
};
Run Code Online (Sandbox Code Playgroud) 将所有二进制文件错误地添加到我的 git 历史记录中后,我有一个大小约为 50 MB 的 git 存储库。如何从历史记录中删除特定提交之前的所有提交?例如,具有以下历史记录,我想删除 C2 之前的所有提交,就像 C2 是第一次提交一样。(实际上C2可能是合并提交)
我已经尝试过git-filter-branch,它根本不能满足我的需要,而且这个脚本似乎很受欢迎,尽管它删除了整个历史记录;留下一个提交。
考虑遵循菱形多重继承:
class base;
class d1 : virtual public base;
class d2 : virtual public base
class d3 : public d1, public d2;
Run Code Online (Sandbox Code Playgroud)
base是一个只移动的类(具有一个大的仅移动缓冲区).所以d1,d2和d3.移动构造函数d1和d2调用移动构造函数base.
然后应该做什么移动构造函数d3?调用d1和d2的移动控制器会导致崩溃(因为移动构造函数base被调用两次.
在这里,我有一个问题的最小可编译实例:
#include <iostream>
struct moveonly {
moveonly(): data(nullptr) {}
moveonly(const moveonly &) = delete;
moveonly(moveonly &&other) {
this->data = other.data;
other.data = nullptr;
}
~moveonly() {
if(data)
delete[] data;
}
char *data;
};
class base {
public:
base() = …Run Code Online (Sandbox Code Playgroud) 我有一个函数模板,该函数至少接受一个参数并对其余参数执行一些格式化:
template <typename T, typename... ARGS>
void foo(T first, ARGS&&... args)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
当第一个参数是特定类型时,我希望它做不同的事情。我喜欢编译器选择这个特定的版本,其中其余的可变参数被忽略。所以我尝试了模板专业化:
template <>
void foo(const ICON* p)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
或者:
template <typename T, typename... ARGS>
void foo(const ICON* p, ARGS&&... args)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
我还尝试了非模板化重载,但它总是选择第一个版本。
调用者代码应该根本不知道模板(遗留代码、向后兼容性废话等),因此它依赖于类型推导和如下调用:
MyClass fooMaker;
fooMaker.set("A", "B", 3.14, 42); // v1
fooMaker.set(pIcon); // v2 (special)
Run Code Online (Sandbox Code Playgroud) c++ templates function-templates overload-resolution variadic-templates