C++ Setter/Getter,cout 工作,printf 失败

C++ Setter/Getter, cout works, printf fails

本文关键字:工作 printf 失败 cout C++ Getter Setter      更新时间:2023-10-16

有人知道为什么C++在可变参数printf函数上失败吗?代码是可修复的吗?这只是一个简单的例子,但一般情况对我来说很重要。

#include <stdio.h>
#include <iostream>
using namespace std;
class Float32 {
public:
float & operator = (const float &newValue) {
return value = newValue;
}
operator float () const {
return value;
}
protected:
float value;
};
int main() {
Float32 value;
value = 0.5;
cout << "cout value: " << value << endl; // this works
printf("something fishy about varargs or something...n");
printf("printf value: %f", value); // fails (outputs random garbage value)
}

如果这是一个编译器错误/问题,我正在使用Visual Studio 2017。

如果这是一个编译器错误/问题,我正在使用Visual Studio 2017。

不,没有编译器错误。一切都按预期工作。

有谁知道为什么C++在可变参数 printf 函数上失败?

printf("printf value: %f", value); 

不会隐式调用转换运算符,而是严格期望float值,而不是Float32实例。

它不能这样做,因为%f是在运行时解析的,printf()不可能知道你的类在那个时候有一个转换运算符。

代码是可修复的吗?

你仍然必须明确地进行强制转换:

printf("printf value: %f", (float)value); 

由于template<typename T> std::ostream& operator<<(std::ostream, const T&)是一个模板函数,它将在编译时推断出最佳转换,这将相反。