Невозможно определить решение для ошибки компилятора с помощью блоков повышения - PullRequest
1 голос
/ 02 декабря 2011

Версия Boost Units : 1,45

Компилятор : Visual Studio 2008

Платформа : Windows 7

Ошибка : При компиляции следующего кода я получаю ошибку C2440 "инициализация": невозможно преобразовать из 'boost :: units :: amount' в 'boost :: units :: amount' с

[ Unit=boost::units::unit>,boost::units::detail::static_power_impl<0>::apply>::type,boost::units::hogogeneous_system>>>>, Y = double ]

и

[ Unit=myproject::types::myproject_length ]

Конструктор для класса 'boost :: единиц :: количества' объявлен 'явным' с

[ Unit=myproject::types::myproject_length ]

Я не уверен, что здесь не так. Если я удаляю «radii_t result =» из следующего кода и закомментирую оператор ввода-вывода, я получаю ту же ошибку, что и ранее цитируемая выше. Ниже приведен код, который я использовал. Я ценю ваше терпение, когда я изучаю Boost Единицы измерения.

Q1: В чем причина этой ошибки? Что в выводе ошибки помогло Вы должны это понять.

Q2: Даже если вышеуказанной ошибки не было, вы упомянули, что провалить анализ измерений. Я думаю, что мы оба согласны, что тип будет радиусы ^ -1. Как вы объявляете тип, возведенный в правильную степень?

Стивен

#include <boost/units/base_unit.hpp>
#include <boost/units/base_units/angle/radian.hpp>
#include <boost/units/io.hpp>
#include <boost/units/make_system.hpp>
#include <boost/units/physical_dimensions/length.hpp>
#include <boost/units/physical_dimensions/time.hpp>
#include <boost/units/static_constant.hpp>

#include <iostream>

namespace myproject {
 namespace types {

   //-------------------------------------
   //          Base dimensions
   //-------------------------------------
   struct length_base_dimension : public boost::units::base_dimension<length_base_dimension,1> {};

   //-------------------------------------
   //          Dimensions
   //-------------------------------------

   struct radii_base_unit : public boost::units::base_unit<radii_base_unit, boost::units::length_dimension, 1>
   {
     static std::string name()   { return("radii"); }
     static std::string symbol() { return("r"); }
   };

   struct minute_base_unit : public boost::units::base_unit<minute_base_unit,boost::units::time_dimension,3>
   {
     static std::string name() { return ("minute"); }
     static std::string symbol() { return ("min"); }
   };

typedef boost::units::make_system<radii_base_unit,
                                 minute_base_unit,
                                 boost::units::angle::radian_base_unit >::type myproject_system_t;

   typedef boost::units::unit<boost::units::length_dimension,myproject_system_t> myproject_length;

   typedef boost::units::quantity<myproject_length, double> radii_t;

   BOOST_UNITS_STATIC_CONSTANT(radii,myproject_length);
 }
}

int main ( int, char** )
{
 using namespace myproject::types;

 radii_t val1 ( 5 * radii );
 radii_t val2 ( 3 * radii );

 radii_t result =  1.0 / ( val1 - val2 );

 std::cout << result << std::endl;

 return 0;
}

1 Ответ

0 голосов
/ 03 декабря 2011
  1. Основная проблема в том, что ваше сообщение компилятора урезано. В gcc это читает:

54:40: error: conversion from ‘boost::units::divide_typeof_helper<double, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<myproject::types::radii_base_unit, boost::units::list<myproject::types::minute_base_unit, boost::units::dimensionless_type> > > > >, double> >::type {aka boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<-0x00000000000000001l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<myproject::types::radii_base_unit, boost::units::list<myproject::types::minute_base_unit, boost::units::dimensionless_type> > > >, void>, double>}’ to non-scalar type ‘myproject::types::radii_t {aka boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<myproject::types::radii_base_unit, boost::units::list<myproject::types::minute_base_unit, boost::units::dimensionless_type> > > > >, double>}’ requested

Однако, в общем, ошибки компилятора boost-модулей немного ... многословны. Обычно я не пытаюсь понять их, а использую boost.units, чтобы убедиться, что мои модули верны, а если нет, внимательно изучите код, чтобы определить, что не так. В вашем случае вы можете сравнить типы aka и увидеть, что знаки для базовых размеров длины отличаются.

Для Q2 boost::units::power_typeof_helper - ваш друг, а также помощники других типов.

...