小编Job*_*Job的帖子

为什么type_info :: name()未指定?

我完全知道返回值std::type_info::name()是实现定义的.

从C++标准(ISO/IEC 14882:2003§18.5.1.7):

返回:实现定义的NTBS.

我的问题是:为什么?如果标准规定返回值应该是什么,那么这个成员函数不会更有用吗?

c++ typeinfo

8
推荐指数
1
解决办法
447
查看次数

当Gcc编译具有多个版本的boost的Boost :: regex时存在未定义的引用

我试图在Linux机器上安装Boost(CentOs,Linux版本2.6.9-67.ELsmp).我按照Boost 入门网页上的说明进行操作.下载并解压缩文件,然后我添加前缀,因为我不是root用户.

./bootstrap.sh --prefix=/my_path/boost-1.49.0
./b2 install
Run Code Online (Sandbox Code Playgroud)

我转到/my_path/boost-1.49.0并检查那里有/ include/boost /和/ lib /包含文件.

我也将LD_LIBRARY_PATH设置为/my_path/boost-1.49.0/lib/.

要测试我是否成功安装,我编译以下代码:

main.cpp中

#include <boost/regex.hpp>
#include <iostream>
#include <string>

using namespace boost;
using namespace std;

int main(int argc, char *argv[])
{
    string line = "12345";
    regex pattern("^123");
    if (regex_match(line, pattern)) cout << "match." << endl;
    else cout << "not match." << endl;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

并按命令编译:

g++ -v -I /my_path/boost-1.49.0/include/boost -L /my_path/boost-1.49.0/lib main.cpp -lboost_regex -o example
Run Code Online (Sandbox Code Playgroud)

并生成以下错误:

Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared …
Run Code Online (Sandbox Code Playgroud)

c++ linux gcc boost boost-regex

7
推荐指数
1
解决办法
8789
查看次数

为类提供类似元组的结构化绑定访问

我正在尝试为类提供类似元组的结构化绑定访问.为简单起见,我将在本文的其余部分使用以下类:

struct Test
{
    int v = 42;
};
Run Code Online (Sandbox Code Playgroud)

(我知道这个类支持开箱即用的结构化绑定,但我们假设它没有.)

启用对成员的类似元组的访问Test,我们必须专门化std::tuple_size并且std::tuple_element:

namespace std
{

template<>
struct tuple_size<Test>
{
    static const std::size_t value = 1;
};

template<std::size_t I>
struct tuple_element<I, Test>
{
    using type = int;
};

}
Run Code Online (Sandbox Code Playgroud)

而我们需要的最后一部分是要么Test::get<i>或函数get<i>(Test)Test的命名空间.让我们实现后者:

template<std::size_t I>
int get(Test t)
{
    return t.v;
}
Run Code Online (Sandbox Code Playgroud)

这有效.但是,我想返回对Test成员的引用std::get(std::tuple),例如,就像.因此,我实现get如下:

template<std::size_t I>
int& get(Test& t)
{
    return t.v;
}

template<std::size_t I> …
Run Code Online (Sandbox Code Playgroud)

c++ c++17 structured-bindings

7
推荐指数
1
解决办法
523
查看次数

与qt4(c ++)一起使用的好ORM?(Django喜欢...)

有人推荐过qt4(c ++)的ORM吗?(就像Django ORM一样).

c++ qt4

6
推荐指数
1
解决办法
2960
查看次数

6
推荐指数
1
解决办法
1026
查看次数

识别常规保护错误(x86)上的错误地址

我正在尝试在x86上为一般保护错误(GP#13)编写ISR.我无法从INTEL文档中找出如何找出导致异常的错误地址.我知道对于页面错误异常(GP#14),cr2寄存器保存了错误地址.任何帮助表示赞赏.

x86 operating-system osdev interrupt-handling

6
推荐指数
1
解决办法
4073
查看次数

gcc -fdump-tree-original 的输出

如果我将 GCC 生成的代码转储为虚拟析构函数(使用 -fdump-tree-original),我会得到如下内容:

;; Function virtual Foo::~Foo() (null)
;; enabled by -tree-original

{
  <<cleanup_point <<< Unknown tree: expr_stmt
  (void) (((struct Foo *) this)->_vptr.Foo = &_ZTV3Foo + 8) >>>
>>;
}
<D.20148>:;
if ((bool) (__in_chrg & 1))
  {
    <<cleanup_point <<< Unknown tree: expr_stmt
  operator delete ((void *) this) >>>
>>;
  }
Run Code Online (Sandbox Code Playgroud)

我的问题是:“ ”后面的代码位于哪里<D.20148>:;?它位于析构函数之外,那么该代码何时执行?

c++ gcc g++ internals

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

为什么在用g ++编译时会出现符号引用错误?

aludra.usc.edu(25): g++ -o final.out final.cpp 
Undefined                       first referenced
 symbol                             in file
data::Get_Networth()                /var/tmp//ccUz9c59.o
data::Set_Networth(double)          /var/tmp//ccUz9c59.o
data::Get_Heightfeet()              /var/tmp//ccUz9c59.o
data::Get_Lettergpa()               /var/tmp//ccUz9c59.o
data::Set_Weight(int)               /var/tmp//ccUz9c59.o
data::Get_Weight()                  /var/tmp//ccUz9c59.o
data::Get_Major()                   /var/tmp//ccUz9c59.o
data::Set_Gpa(double)               /var/tmp//ccUz9c59.o
data::Get_GPA()                     /var/tmp//ccUz9c59.o
data::Set_Age(int)                  /var/tmp//ccUz9c59.o
data::Get_Age()                     /var/tmp//ccUz9c59.o
data::Set_Major(std::basic_string, std::allocator               >)/var/tmp//ccUz9c59.o
data::Set_Data(std::basic_string, std::allocator >,     int, int, int, double, std::basic_string, std::allocator >, double)/var/tmp//ccUz9c59.o
data::Get_Heightfeetremainder()     /var/tmp//ccUz9c59.o
data::Set_Heightinches(int)         /var/tmp//ccUz9c59.o
data::data()                        /var/tmp//ccUz9c59.o
data::Get_Name()                    /var/tmp//ccUz9c59.o
data::Get_Heightinches()            /var/tmp//ccUz9c59.o
ld: fatal: Symbol referencing errors. No output written to final.out
collect2: ld returned 1 exit status

这是我在Solaris中编译时不断使用g ++的内容.该代码在VS2010中完美编译.所以我无法弄清楚出了什么问题.

这是我的类文件的代码data.h:

    #include <string>


using namespace …
Run Code Online (Sandbox Code Playgroud)

c++ g++

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

在设置阶段忽略模拟调用

我经常面临这样一个问题,即模拟对象需要在测试的“有趣”部分开始之前进入某种状态。

例如,假设我想测试以下类:

struct ToTest
{
    virtual void onEnable();
    virtual void doAction();
};
Run Code Online (Sandbox Code Playgroud)

因此,我创建了以下模拟类:

struct Mock : ToTest
{
    MOCK_METHOD0(onEnable, void());
    MOCK_METHOD0(doAction, void());
};
Run Code Online (Sandbox Code Playgroud)

第一个测试是onEnableToTest启用使用对象的系统时调用:

TEST(SomeTest, OnEnable)
{
    Mock mock;
    // register mock somehow

    // interesting part of the test
    EXPECT_CALL(mock, onEnable());
    EnableSystem();
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。第二个测试是doAction在系统执行操作并启用时调用。因此,应该在测试的有趣部分开始之前启用系统:

TEST(SomeTest, DoActionWhenEnabled)
{
    Mock mock;
    // register mock somehow

    // initialize system
    EnableSystem();

    // interesting part of the test
    EXPECT_CALL(mock, doAction());
    DoSomeAction();

}
Run Code Online (Sandbox Code Playgroud)

这有效,但会发出令人讨厌的警告,提示对onEnable. 这个问题似乎有两个常见的修复方法:

  1. 使用 …

c++ unit-testing googletest googlemock

5
推荐指数
2
解决办法
5275
查看次数

静态库和生成的标头中的循环依赖关系

假设我有一个项目,它创建了两个静态库目标(foobar),它们之间存在循环依赖关系.CMake明确允许这个,它通常工作正常,因为构建这些库的顺序无关紧要.

但是,如果这两个库都生成了作为其接口一部分的头文件(Foo.hppfor foo,Bar.hppfor bar),则可能会出现问题,因为标头的生成通常是作为构建库的一部分(例如,via add_custom_targetadd_dependencies)完成的.也就是说,建筑foo将产生Foo.hpp但也需要Bar.hpp建造bar需求Foo.hpp......

我找到了解决这个问题的方法,初看起来似乎很完美.它包括使用生成标头add_custom_command,然后使用标头将标头添加到PUBLIC目标源target_sources.这样,目标本身及其依赖项将对标头具有文件级依赖性,这将在正确的时间触发自定义命令.

这是我的解决方案的MWE:

cmake_minimum_required(VERSION 3.5)
project(Foo)

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Foo.hpp
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/Foo.hpp
    COMMENT "Generating Foo.hpp"
)

add_library(foo STATIC Foo.cpp)
target_include_directories(foo PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
target_sources(foo PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/Foo.hpp)
target_link_libraries(foo bar)

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Bar.hpp
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/Bar.hpp
    COMMENT "Generating Bar.hpp"
)

add_library(bar STATIC Bar.cpp)
target_include_directories(bar …
Run Code Online (Sandbox Code Playgroud)

c++ cmake

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