C ++ операторы множественного преобразования - PullRequest
2 голосов
/ 04 марта 2020

Я определил класс, как показано ниже, с двумя переменными-членами и двумя операторами преобразования (оператор float и оператор chrono :: microseconds). Но приведенный ниже код работает, только если я закомментирую оператор float. В противном случае выдает ошибку (не может преобразовать тип). Я не могу понять, почему?

#include <iostream>
#include <chrono>

using namespace std::chrono_literals;

class Peak {
public:
  Peak (std::chrono::microseconds t, float magnitude)
  : t_(t),
    magnitude_(magnitude)
  {
  };

  std::chrono::microseconds get_t() { return t_; }
  //have to comment this out or I get an error
  operator float() { return magnitude_; }
  operator std::chrono::microseconds() {
      return t_;
  }
private:
  std::chrono::microseconds t_{2us};
  float magnitude_;
};

int main()
{
  Peak a{3us, 100};
  std::cout
    << "t is "
    << static_cast<std::chrono::microseconds>(a).count();
}

1 Ответ

3 голосов
/ 04 марта 2020

Похоже на ошибку компилятора в G CC 7.3 и старше. Обходной путь, кажется, строит, используя флаг -std=c++17. В качестве альтернативы, оператор преобразования float explicit также исправляет это:

explicit operator float() const { return magnitude_; }

(Кстати, всегда полезно пометить эти const.)

Обновление :

На самом деле, просто заставляя эти операторы const, похоже, исправить это уже без необходимости делать float один explicit или строить с -std=c++17.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...