/ / ¿Cómo resolver un conflicto de nombres entre una macro de encabezado del sistema y una función de plantilla de impulso? - c ++, boost, xlc

¿Cómo resolver un conflicto de nombres entre una macro de encabezado de sistema y una función de plantilla de impulso? - c ++, boost, xlc

¿Cuál es la mejor manera de resolver un nombre de macro conflictivo con una función de plantilla de impulso? Después de incluir boost / chrono.hpp recibí el error del compilador:

CCN5816 (W) Se especifican demasiados argumentos paraLa macro "ronda". Los argumentos adicionales son ignorados. "/usr/include/math.h", línea 2133.16: CCN5425 (I) "round" se define en la línea 2133 de "/usr/include/math.h".

round conflictos con la función de plantilla boost::chrono::round.

/usr/include/math.h

#define round(x)         __round(x)

/boost/chrono/round.hpp

namespace boost
{
namespace chrono
{

/**
* rounds to nearest, to even on tie
*/
template <class To, class Rep, class Period>
To round(const duration<Rep, Period>& d)
{
  • Parece que yo tampoco puedo #undef la macro si parcho round.hpp
  • Tal vez pueda usar parantheses? En la respuesta a Conflicto macro y función miembro el nombre de la función está entre paréntesis, pero está en el uso de la función, no en su definición. ¿Funcionaría también en la definición?

BoostChronoTest.cpp

#include <gtest/gtest.h>
#include <boost/chrono.hpp>

TEST(BoostChronoTest, simpleTests) {
boost::chrono::nanoseconds ns(12000);

// conversion with precision loss requires a cast
boost::chrono::microseconds ms = boost::chrono::duration_cast<boost::chrono::microseconds>(ns);

// no precision loss
boost::chrono::nanoseconds  ns2 = ms;

ms++;
ms += boost::chrono::duration_cast<boost::chrono::microseconds>(ns);
ns *= 2;
EXPECT_TRUE(ms > ns);
EXPECT_EQ(ms, boost::chrono::microseconds(25));
EXPECT_EQ(ns, boost::chrono::nanoseconds(24000));
EXPECT_EQ(ns2, boost::chrono::microseconds(12));
EXPECT_EQ(ns2, boost::chrono::nanoseconds(12000));
}

Respuestas

-1 para la respuesta № 1

Simplemente, siempre incluso <gtest/gtest.h> después <boost/chrono.hpp>: de esa manera el #define round ... no afectará el código de impulso.