【问题标题】:C2664 error with boost depth_first_search.hpp when compiling with /clr使用 /clr 编译时 boost depth_first_search.hpp 出现 C2664 错误
【发布时间】:2015-10-28 13:07:57
【问题描述】:

我正在使用的库使用 boost depth_first_search.hpp。当我尝试编译时,我收到一条很长的错误消息:

Error C2664 'boost::type_traits::no_type boost::detail::has_member_function_finish_edge_detail_hcmf<BOOST_TTI_DETAIL_TP_T>::chkt<has_member_function_finish_edge_detail_hcmf<BOOST_TTI_DETAIL_TP_T>::cl_type<BOOST_TTI_DETAIL_TP_T>::type>(...)': cannot convert argument 1 from 'nullptr' to '...' 

错误信息指向这一行:

BOOST_TTI_HAS_MEMBER_FUNCTION(finish_edge)

在 depth_first_search.hpp 中。这通过几个预处理器宏解析为一些非常长的函数,显然是为了检查是否存在名为 finish_edge 的函数。

我尝试了一些不同的方法来让它工作并找出问题所在。我发现只有在使用 /CLR 标志编译时才会发生错误。我已经建立了一个空项目,其中 main.cpp 中唯一的东西是 #include &lt;boost/graph/depth_first_search.hpp&gt; 和一个空的 main。如果我用 /CLR 编译项目,问题就在那里,但如果删除 /CLR,它编译得很好。

问题是我需要 clr 支持,因为我正在编写一组用于 C# 的包装器。我尝试按照here 的描述将 depth_first_search.hpp 编译为非托管,但没有成功。

此外,我发现我可以注释掉这个函数,而且它看起来工作正常,但我想在不做这样的黑客的情况下工作。

如何获得提升以更好地使用 C++CLI?

编辑:我创建了一个 SSCCE here。项目属性显然应该更新,以便额外的包含目录是提升的点。

这是主文件:

#include <boost/graph/depth_first_search.hpp>
using namespace System;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");
    return 0;
}

【问题讨论】:

  • 嗯,C++/CLI 是基于旧版本的 C++,从那以后就很少有人喜欢了。所以,事情一定会很困难。
  • “我尝试将 ... 编译为非托管 ...,但没有成功。”与“我如何获得提升以更好地使用 C++CLI?”。在我看来,你在吠叫错误的树。做一个SSCCE我来修(最好是非托管版本)
  • @Deduplicator BGL 完全是 c++03 证明
  • @sehe:嗯,这使得将 boost 库编译为 C++/CLI 不太可能成为问题。感谢您提供的信息。
  • 我正在整理一个 SSCCE,稍后会放上去。 @Deduplicator。为什么要删除 C++ 标签。这是关于 C++-cli 和常规 C++ 之间的互操作。当然这两个标签都适用。

标签: .net boost c++-cli interop visual-studio-2015


【解决方案1】:

我现在确实找到了解决方法。

注释掉 BOOST_TTI_HAS_MEMBER_FUNCTION(finish_edge) 行时 并更换线路 do_call_finish_edge

它对我有用...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-06-06
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多