C ++ Setter / Getter, cout работает, printf не работает - PullRequest
0 голосов
/ 20 октября 2018

Кто-нибудь знает, почему С ++ не работает с функцией variadic 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.

1 Ответ

0 голосов
/ 20 октября 2018

В случае, если это ошибка / проблема компилятора, я использую Visual Studio 2017.

Нет, ошибки компилятора нет.Все работает, как и ожидалось.

Кто-нибудь знает, почему С ++ не работает с функцией variadic 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&) являетсяФункция шаблона, она выведет наилучшее возможное преобразование во время компиляции, и это будет работать наоборот.

...