gpt4 book ai didi

c++ - 宏中模板参数数量错误

转载 作者:行者123 更新时间:2023-12-02 10:58:36 26 4
gpt4 key购买 nike

我最近从Ubuntu 16.04升级到18.04,从那时起,我的C++代码的一部分不再编译了(但这也可能只是巧合)。

以下是未编译内容的最小示例:

#include <boost/test/unit_test.hpp>
#include <boost/preprocessor/punctuation/comma.hpp>
template<unsigned a, unsigned b> struct Tmpl { };
BOOST_FIXTURE_TEST_CASE( abc, Tmpl<1 BOOST_PP_COMMA() 1> ) { }

这是gcc的错误消息:
In file included from /home/ingo/opt/boost-1.68.0/include/boost/test/unit_test.hpp:19,
from min_ex.cpp:1:
min_ex.cpp:4:36: error: wrong number of template arguments (1, should be 2)
BOOST_FIXTURE_TEST_CASE( abc, Tmpl<1 BOOST_PP_COMMA() 1> ) { }
^
/home/ingo/opt/boost-1.68.0/include/boost/test/unit_test_suite.hpp:142:27: note: in definition of macro ‘BOOST_FIXTURE_TEST_CASE_WITH_DECOR’
struct test_name : public F { void test_method(); }; \
^
/home/ingo/opt/boost-1.68.0/include/boost/test/detail/pp_variadic.hpp:35:5: note: in expansion of macro ‘BOOST_TEST_INVOKE_VARIADIC’
BOOST_TEST_INVOKE_VARIADIC( \
^~~~~~~~~~~~~~~~~~~~~~~~~~
/home/ingo/opt/boost-1.68.0/include/boost/test/unit_test_suite.hpp:176:5: note: in expansion of macro ‘BOOST_TEST_INVOKE_IF_N_ARGS’
BOOST_TEST_INVOKE_IF_N_ARGS( 2, \
^~~~~~~~~~~~~~~~~~~~~~~~~~~
min_ex.cpp:4:1: note: in expansion of macro ‘BOOST_FIXTURE_TEST_CASE’
BOOST_FIXTURE_TEST_CASE( abc, Tmpl<1 BOOST_PP_COMMA() 1> ) { }
^~~~~~~~~~~~~~~~~~~~~~~
min_ex.cpp:3:41: note: provided for ‘template<unsigned int a, unsigned int b> struct Tmpl’
template<unsigned a, unsigned b> struct Tmpl { };
^~~~
In file included from /home/ingo/opt/boost-1.68.0/include/boost/test/unit_test.hpp:19,
from min_ex.cpp:1:
/home/ingo/opt/boost-1.68.0/include/boost/test/unit_test_suite.hpp:163:20: error: expected primary-expression before ‘)’ token
decorators ); \
^
/home/ingo/opt/boost-1.68.0/include/boost/test/detail/pp_variadic.hpp:27:51: note: in expansion of macro ‘BOOST_FIXTURE_TEST_CASE_WITH_DECOR’
# define BOOST_TEST_INVOKE_VARIADIC( tool, ... ) tool (__VA_ARGS__)
^~~~
/home/ingo/opt/boost-1.68.0/include/boost/test/detail/pp_variadic.hpp:35:5: note: in expansion of macro ‘BOOST_TEST_INVOKE_VARIADIC’
BOOST_TEST_INVOKE_VARIADIC( \
^~~~~~~~~~~~~~~~~~~~~~~~~~
/home/ingo/opt/boost-1.68.0/include/boost/preprocessor/control/iif.hpp:25:39: note: in expansion of macro ‘BOOST_PP_IIF_0’
# define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_ ## bit(t, f)
^~~~~~~~~~~~~
/home/ingo/opt/boost-1.68.0/include/boost/preprocessor/control/iif.hpp:18:37: note: in expansion of macro ‘BOOST_PP_IIF_I’
# define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_I(bit, t, f)
^~~~~~~~~~~~~~
/home/ingo/opt/boost-1.68.0/include/boost/test/detail/pp_variadic.hpp:36:9: note: in expansion of macro ‘BOOST_PP_IIF’
BOOST_PP_IIF( \
^~~~~~~~~~~~
/home/ingo/opt/boost-1.68.0/include/boost/test/unit_test_suite.hpp:176:5: note: in expansion of macro ‘BOOST_TEST_INVOKE_IF_N_ARGS’
BOOST_TEST_INVOKE_IF_N_ARGS( 2, \
^~~~~~~~~~~~~~~~~~~~~~~~~~~
min_ex.cpp:4:1: note: in expansion of macro ‘BOOST_FIXTURE_TEST_CASE’
BOOST_FIXTURE_TEST_CASE( abc, Tmpl<1 BOOST_PP_COMMA() 1> ) { }
^~~~~~~~~~~~~~~~~~~~~~~

我正在尝试使用以下命令进行编译:
g++ -I/home/ingo/opt/boost-1.68.0/include -Wall -c -fmessage-length=0 -std=c++17 -MMD -MP -MF "min_ex.d" -MT "min_ex.o" -o "min_ex.o" "min_ex.cpp" 

我试图在预处理器的输出中找到错误,但对我来说很难看到任何东西。预处理器输出的最后两行是:
template<unsigned a, unsigned b> struct Tmpl { };

struct abc : public Tmpl<1 { void test_method(); }; static void abc_invoker() { ::boost::unit_test::unit_test_log.set_checkpoint( ::boost::unit_test::const_string( "../src/test/min_ex.cpp", sizeof( "../src/test/min_ex.cpp" ) - 1 ), static_cast<std::size_t>(6), (::boost::wrap_stringstream().ref() << '"' << "abc" << "\" fixture ctor").str() ); abc t; ::boost::unit_test::unit_test_log.set_checkpoint( ::boost::unit_test::const_string( "../src/test/min_ex.cpp", sizeof( "../src/test/min_ex.cpp" ) - 1 ), static_cast<std::size_t>(6), (::boost::wrap_stringstream().ref() << '"' << "abc" << "\" fixture setup").str() ); boost::unit_test::setup_conditional(t); ::boost::unit_test::unit_test_log.set_checkpoint( ::boost::unit_test::const_string( "../src/test/min_ex.cpp", sizeof( "../src/test/min_ex.cpp" ) - 1 ), static_cast<std::size_t>(6), (::boost::wrap_stringstream().ref() << '"' << "abc" << "\" test entry").str() ); t.test_method(); ::boost::unit_test::unit_test_log.set_checkpoint( ::boost::unit_test::const_string( "../src/test/min_ex.cpp", sizeof( "../src/test/min_ex.cpp" ) - 1 ), static_cast<std::size_t>(6), (::boost::wrap_stringstream().ref() << '"' << "abc" << "\" fixture teardown").str() ); boost::unit_test::teardown_conditional(t); ::boost::unit_test::unit_test_log.set_checkpoint( ::boost::unit_test::const_string( "../src/test/min_ex.cpp", sizeof( "../src/test/min_ex.cpp" ) - 1 ), static_cast<std::size_t>(6), (::boost::wrap_stringstream().ref() << '"' << "abc" << "\" fixture dtor").str() ); } struct abc_id {}; static boost::unit_test::ut_detail::auto_test_unit_registrar abc_registrar60( boost::unit_test::make_test_case( &abc_invoker, "abc", "../src/test/min_ex.cpp", 6 ), 1> ); void abc::test_method() { }

最佳答案

只需尝试将模板定义移至其他typedef即可:

#include <boost/test/unit_test.hpp>
template<unsigned a, unsigned b> struct Tmpl { };

typedef Tmpl<1, 1> toto;
BOOST_FIXTURE_TEST_CASE( abc, toto ) { }

问题来自被解释为宏参数的 ,。与使用预处理程序库相比,以这种方式编写内容使IMO更具可读性。

请在操作 here中查看此代码。

关于c++ - 宏中模板参数数量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52443289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com