C++ 多重转换运算符
C++ multiple conversion operators
我定义了一个class,如下所示,有两个成员变量和两个转换运算符(operator float 和operator 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();
}
看起来像是 GCC 7.3 及更早版本中的编译器错误。解决方法似乎是使用 -std=c++17
标志进行构建。或者,使 float
转换运算符 explicit
也可以修复它:
explicit operator float() const { return magnitude_; }
(顺便标记一下这些 const
总是个好主意。)
更新:
实际上,只需将这些运算符设置为 const
似乎就可以解决问题,而无需将 float
设置为 explicit
,也无需使用 -std=c++17
构建。
我定义了一个class,如下所示,有两个成员变量和两个转换运算符(operator float 和operator 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();
}
看起来像是 GCC 7.3 及更早版本中的编译器错误。解决方法似乎是使用 -std=c++17
标志进行构建。或者,使 float
转换运算符 explicit
也可以修复它:
explicit operator float() const { return magnitude_; }
(顺便标记一下这些 const
总是个好主意。)
更新:
实际上,只需将这些运算符设置为 const
似乎就可以解决问题,而无需将 float
设置为 explicit
,也无需使用 -std=c++17
构建。