调试模板中的问题。编译失败专门针对Linux GCC 7,GCC 6,GCC 5,GCC 4.9错误:模板参数1无效

问题描述 投票:0回答:1

我的T​​ravis仅在Linux GCC 7,GCC 6,GCC 5,GCC 4.9失败时出现错误

libs/astronomy/test/coordinate/equatorial_coord.cpp:22:57: error: template argument 1 is invalid
         RightAscension<double, quantity<bud::plane_angle>>
                                                         ^
libs/astronomy/test/coordinate/equatorial_coord.cpp:23:39: error: template argument 2 is invalid
                 ra(25.0 * bud::degrees);

这里是equatorial_cord.cpp

#define BOOST_TEST_MODULE equatorial_coord_test

#include <iostream>
#include <boost/units/io.hpp>
#include <boost/units/quantity.hpp>
#include <boost/units/systems/angle/degrees.hpp>
#include <boost/units/systems/si/plane_angle.hpp>
#include <boost/astronomy/coordinate/coord_sys/equatorial_coord.hpp>

#include <boost/test/unit_test.hpp>

using namespace boost::astronomy::coordinate;
using namespace boost::units;
using namespace boost::units::si;
namespace bud = boost::units::degree;
namespace bu = boost::units;

BOOST_AUTO_TEST_SUITE(angle)

    BOOST_AUTO_TEST_CASE(right_ascension) {
        //Create object of Right Ascension
        RightAscension<double, quantity<bud::plane_angle>>
                ra(25.0 * bud::degrees);

        //Check value
        BOOST_CHECK_CLOSE(ra.get_angle().value(), 25.0, 0.001);

        //Quantity stored as expected?
        BOOST_TEST((std::is_same<decltype(ra.get_angle()), quantity<bud::plane_angle>>::value));
    }

BOOST_AUTO_TEST_SUITE_END()

其中包括并使用Equatorial_coord.hpp

#include <iostream>
#include <boost/units/io.hpp>
#include <boost/geometry/core/cs.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/units/systems/angle/degrees.hpp>
#include <boost/units/systems/si/plane_angle.hpp>
#include <boost/astronomy/coordinate/coord_sys/coord_sys.hpp>

namespace boost {
    namespace astronomy {
        namespace coordinate {

            namespace bu = boost::units;
            namespace bg = boost::geometry;
            namespace bud = boost::units::degree;

            //Right Ascension
            template
                    <
                            typename CoordinateType = double,
                            typename RightAscensionQuantity = bu::quantity<bu::si::plane_angle, CoordinateType>
                    >
            struct RightAscension {
            private:
                RightAscensionQuantity ra;
            public:
                RightAscension(){
                    ra = 0.0 * bu::si::radian;
                };

                RightAscension(RightAscensionQuantity const& _ra) : ra(_ra) {}

                RightAscensionQuantity get_angle() const{
                    return static_cast<RightAscensionQuantity>(ra);
                }

                void print() {
                    std::cout << "Right Ascension: " << ra;
                }
            };
...

[它可以在我的机器上完美地构建,并且我尝试了一些代码变化,但是我不明白我所缺少的是针对Linux GCC 7,GCC 6,GCC 5,GCC 4.9的构建失败。

在这个项目中,我以类似的方式制作了许多标题,但从未遇到过这样的问题。如有任何建议,我将不胜感激。

https://dev.azure.com/lpranam/lpranam/_build/results?buildId=392&view=logs&j=d5b3eaca-5133-5bed-7ece-a6421a4fcca5&t=9b0787b9-d206-5213-01a9-f3ff4bf8b6d6

c++ gcc build travis-ci template-meta-programming
1个回答
1
投票

引起问题的项目中有namespace bud = boost::units::degree;的多个定义。从Equatorial_coord.hpp中删除它会为您带来神奇的效果。

© www.soinside.com 2019 - 2024. All rights reserved.