我已经使用Boost :: Python了一段时间,而且一切都很好.然而昨天我试图找出为什么我认为我注册的特定类型(一个元组)在我尝试从Python访问它时给了我错误.
事实证明,虽然元组实际上已经注册,但是当试图通过std::vector包裹来访问它时,vector_indexing_suite这已经不够了.
我在想,为什么它不起作用?有没有办法让这项工作?我应该尝试用手包裹矢量吗?
以下是我的MVE:
#include <tuple>
#include <vector>
#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
template <typename T>
struct TupleToPython {
TupleToPython() {
boost::python::to_python_converter<T, TupleToPython<T>>();
}
template<int...>
struct sequence {};
template<int N, int... S>
struct generator : generator<N-1, N-1, S...> { };
template<int... S>
struct generator<0, S...> {
using type = sequence<S...>;
};
template <int... I>
static boost::python::tuple boostConvertImpl(const T& t, sequence<I...>) {
return boost::python::make_tuple(std::get<I>(t)...);
}
template <typename... Args>
static boost::python::tuple boostConvert(const std::tuple<Args...> & t) {
return …Run Code Online (Sandbox Code Playgroud) 我正在用CMake构建我的项目,我正在尝试为每个模块创建一堆测试套件.显然,如果我修改变量,CMAKE_RUNTIME_OUTPUT_DIRECTORY那么ctest无法找到要运行的测试并失败.
我已经做了一个最小的例子来展示我正在谈论的内容,并且我在Lubuntu 13.10上使用CMake 2.8.11.2运行它.如果有人能告诉我这是一个错误和/或如何解决它,我会很感激.谢谢.
文件CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
project (Test)
# Put all tests in the test directory, where the sources also are
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/test)
enable_testing()
add_subdirectory (${PROJECT_SOURCE_DIR}/test)
Run Code Online (Sandbox Code Playgroud)
文件测试/ CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
add_executable(ttest main.cpp)
add_test(ttest ttest)
Run Code Online (Sandbox Code Playgroud)
file test/main.cpp:
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在新文件夹中构建后build,可在文件夹中正确创建可执行文件test.make test从build 运行会产生以下输出:
Running tests...
Test project /home/svalorzen/Tests/cmake/build
Start 1: ttest
Could not find executable ttest
Looked in the following places:
ttest
ttest
Release/ttest
Release/ttest
Debug/ttest
Debug/ttest
MinSizeRel/ttest …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Visual Studio 2013在Windows 7上编译我的一个项目.我已经安装了Boost 1.53并使用cmake设置了解决方案.
现在发生的是现在编译的boost库就是这种形式libboost_*-vc120-mt(-gd)-1_53.lib.在链接器项目选项中,在输入选项卡下,我已经验证了我需要的库,并且实际上编译器能够正确读取它们.
但是,由于某种原因,我完全无法理解,链接器也在尝试查找编译为的库vc110.例如:
error LNK1104: cannot open file 'libboost_filesystem-vc110-mt-gd-1_53.lib'
Run Code Online (Sandbox Code Playgroud)
项目选项中列出的Platform Toolset是"Visual Studio 2013(v120)".我在任何项目选项中都找不到对vc110的引用.你能帮我理解发生了什么吗?
我有以下剪切的代码,不编译.
#include <iostream>
struct A {
void foo() {}
};
struct B : public A {
using A::foo;
};
template<typename U, U> struct helper{};
int main() {
helper<void (A::*)(), &A::foo> compiles;
helper<void (B::*)(), &B::foo> does_not_compile;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它自&B::foo解析后不编译&A::foo,因此无法与提议的类型匹配void (B::*)().由于这是SFINAE模板的一部分,我用它来检查一个非常具体的接口(我强制使用特定的参数类型和输出类型),我希望这可以独立于继承,同时保持检查的可读性.
我尝试的内容包括:
抛出论证的第二部分:
helper<void (B::*)(), (void (B::*)())&B::foo> does_not_compile;
遗憾的是,这并没有帮助,因为第二部分现在不被认为是一个常量表达式,并且失败了.
我已经尝试为变量分配引用,以便检查它.
constexpr void (B::* p)() = &B::foo;
helper<void (B::* const)(), p> half_compiles;
这个代码被clang 3.4接受,但g ++ 4.8.1拒绝它,我不知道谁是对的.
有任何想法吗?
编辑:由于许多评论要求更具体的问题版本,我会在这里写:
我正在寻找的是一种明确检查类是否尊重特定接口的方法.此检查将用于验证模板化函数中的输入参数,以便它们遵守这些函数所需的合约,以便在类和函数不兼容的情况下(即类型特征类型的检查)预先停止编译.
因此,我需要能够验证我请求的每个成员函数的返回类型,参数类型和数量,常量等.最初的问题是我用来验证匹配的更大模板的检查部分.
我正在尝试使用JsonCpp库.我在Windows上,使用MinGW和CodeBlocks.
当我在json头中包含任何内容时,我的链接器会崩溃并发出这两个错误.我已经开始环顾四周了,我发现了另外两个基本上描述我问题的问题:
g ++和"未定义引用`__gxx_personality_v0'"的问题
如果我将两个缺失的变量声明为void指针,如下所示,则问题就会消失:
void * __gxx_personality_v0=0;
void * _Unwind_Resume =0;
Run Code Online (Sandbox Code Playgroud)
但是,我不明白为什么会发生这种错误.CodeBlocks已设置为使用migw32-g ++表示cpp文件,并且添加-lstdc ++选项并不能解决问题.选项-fno-exception也没有(我想要例外,请注意,我只是在尝试).
我还在同一个文件中包含一个boost库,不会造成任何问题.
编辑:
错误输出正是我在标题中所说的:在链接期间,我总共获得了22个未定义的_Unwind_Resume和__gxx_personality_v0引用.我的代码是:
#include <boost/algorithm/string.hpp>
#include <include/json/value.h>
//void * __gxx_personality_v0=0;
//void * _Unwind_Resume =0;
int main () {
std::string str1("Hello world!");
boost::to_upper(str1);
Json::Value k;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只有当我包含/使用JsonCPP库时才会出现错误.取消注释注释行可以解决问题.
命令行输出如下:
mingw32-g++.exe -Wall -fexceptions -g -DSFML_DYNAMIC -IC:\Users\Svalorzen\Documents\Projects\boost_1_49 -IC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -IC:\Users\Svalorzen\Documents\Projects\SFML-1.6\include -IC:\Users\Svalorzen\Documents\Projects\hge181\include -c C:\Users\Svalorzen\Documents\Projects\test\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -LC:\Users\Svalorzen\Documents\Projects\SFML-1.6\lib -LC:\Users\Svalorzen\Documents\Projects\hge181\lib -o bin\Debug\test.exe obj\Debug\main.o -fno-exceptions -lsfml-graphics -lsfml-window -lsfml-system C:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0\libs\mingw\libjson_mingw_libmt.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhge.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhelp.a
Output size is 1.22 MB
Process terminated with …Run Code Online (Sandbox Code Playgroud) 我正在为一些没有编译的代码做一些测试,我发现这段代码:
struct A {
A(int) {};
virtual void foo() = 0;
};
struct B : public virtual A {
virtual void bar() = 0;
};
struct C : public B {
C() : A(1) {}
virtual void foo() override {}
virtual void bar() override {}
};
int main() {
C c;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在C++ 11中无法编译(在g ++ 7.0.1上)‘B::B()’ is implicitly deleted because the default definition would be ill-formed,而在C++ 14中编译成功.
我试图找出C++ 14的哪个新功能允许它工作,但无济于事.cppreference中的描述没有提到任何类似的东西.
为什么这段代码可以用C++ 14编译而不能用C++ 11编译?
我有N维矩阵,其中包含具有N个参数的函数的值.每个参数都有一个离散数量的值.我需要最大化除了一个参数之外的所有参数的函数,从而产生大小等于非最大化参数的值的一维向量.我还需要保存其他参数所采用的值.
为此,我想迭代地应用numpy.max不同的轴来减少矩阵的维数以找到我需要的东西.最终的矢量将取决于我遗漏的参数.
然而,我无法找到最终元素的原始索引(其中包含有关其他参数所采用值的信息).我虽然numpy.argmax以同样的方式使用,numpy.max但我无法获得原始索引.
我正在尝试的一个例子是:
x = [[[1,2],[0,1]],[[3,4],[6,7]]]
args = np.argmax(x, 0)
Run Code Online (Sandbox Code Playgroud)
这回来了
[[1 1]
[1 1]]
Run Code Online (Sandbox Code Playgroud)
这意味着argmax正在选择原始矩阵中的元素(2,1,4,7).但如何获得他们的指数?我尝试unravel_index使用args直接作为矩阵的索引x,从numpy到索引的一堆函数没有成功.
使用numpy.where不是解决方案,因为输入矩阵内部可能具有相等的值,因此我无法从不同的原始值中辨别出来.
我使用它是asn1c为了从一个或多个.asn1文件生成一系列文件.h并将.c其放入给定的文件夹中。
这些C 文件的名称与原始文件没有对应关系asn1。
这些文件必须与我的文件链接在一起才能获得有效的可执行文件。我希望能够:
add_custom_target)asn1c在文件丢失或其中一个.asn1文件已更新时自动运行可执行文件。由于预先不知道生成的文件,因此可以仅全局显示命令输出目录的内容asn1c- 只要该目录不为空,我就很高兴。
我发现以下一段代码:
#include <iostream>
#include <vector>
template <typename T>
struct X : std::false_type {};
template <template <typename> class Y, typename U>
struct X<Y<U>> : std::true_type {};
int main() {
if (X<int>())
std::cout << "wrong\n";
if (X<std::vector<double>>())
std::cout << "correct\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
仅correct在使用g++-7with 编译时打印-std=c++1z.其它版本g++,clang++或者其他std标志不能产生正确的.
这是当前实现的错误,并且此代码不应该打印任何内容,或者是否在C++ 17中发生了变化,这使得此代码按预期工作?
考虑以下代码:
#include <utility>
#include <vector>
using V = std::vector<int>;
int main() {
std::pair<int, V> p1{1, 2}; // p1.second has 2 elements
std::pair<int, V> p2{1, {2}}; // p2.second has 1 element
std::pair<V, V> p3{2, 2}; // Both vectors have 2 elements
std::pair<V, V> p4{{2}, {2}}; // Both vectors have 1 element
std::pair<V, V> p5{2, {2}}; // Does not compile
// p5.first should have 2 elements, while the other should have 1
}
Run Code Online (Sandbox Code Playgroud)
我的主要问题是最后一行 ,p5它不能编译,g++-12但可以编译g++-10。我想知道: