我完全知道返回值std::type_info::name()是实现定义的.
从C++标准(ISO/IEC 14882:2003§18.5.1.7):
返回:实现定义的NTBS.
我的问题是:为什么?如果标准规定返回值应该是什么,那么这个成员函数不会更有用吗?
我试图在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) 我正在尝试为类提供类似元组的结构化绑定访问.为简单起见,我将在本文的其余部分使用以下类:
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) 有人推荐过qt4(c ++)的ORM吗?(就像Django ORM一样).
我正在尝试在x86上为一般保护错误(GP#13)编写ISR.我无法从INTEL文档中找出如何找出导致异常的错误地址.我知道对于页面错误异常(GP#14),cr2寄存器保存了错误地址.任何帮助表示赞赏.
如果我将 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>:;?它位于析构函数之外,那么该代码何时执行?
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) 我经常面临这样一个问题,即模拟对象需要在测试的“有趣”部分开始之前进入某种状态。
例如,假设我想测试以下类:
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)
第一个测试是onEnable在ToTest启用使用对象的系统时调用:
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. 这个问题似乎有两个常见的修复方法:
假设我有一个项目,它创建了两个静态库目标(foo和bar),它们之间存在循环依赖关系.CMake明确允许这个,它通常工作正常,因为构建这些库的顺序无关紧要.
但是,如果这两个库都生成了作为其接口一部分的头文件(Foo.hppfor foo,Bar.hppfor bar),则可能会出现问题,因为标头的生成通常是作为构建库的一部分(例如,via add_custom_target和add_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++ ×8
g++ ×2
gcc ×2
boost ×1
boost-regex ×1
c ×1
c++17 ×1
cmake ×1
googlemock ×1
googletest ×1
internals ×1
linux ×1
osdev ×1
qt4 ×1
typeinfo ×1
unit-testing ×1
windows ×1
x86 ×1