Задать вопрос
Qubc
@Qubc
Ненавижу полисемию.

Почему tellg() неявно приводится к int при инициализации int, но не может быть сложенным с int?

int lenght = file.tellg ( ); // ок

file.tellg ( ) + 2; // не ок
file.tellg ( ) - 2; // не ок


// MSVC
#include <fstream>
#include <iostream>

void main () {
    std::ifstream file ( "input.txt" );
    if (!file.is_open ()) {
        return;
    }

    auto sp = file.tellg ();
/*
using pos_type = typename _Traits::pos_type;
*/

    file.seekg ( 0, std::ios_base::end );

    int lenght = file.tellg (); 
    file.seekg ( lenght - 3, std::ios_base::beg );//  [?]/r/n
    //! file.seekg ( file.tellg () - 3, std::ios_base::beg )
/*
    file.tellg () - 3;
    Severity	Description	Line	Code	Project	File	Suppression State
    Error (active)	more than one operator "-" matches these operands:	29	E0350	test1	
*/

    char ch;
    file.get ( ch );
    std::cout << ch;
}
  • Вопрос задан
  • 137 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Очевидно, потому что возвращаемый тип имеет определенный оператор преобразования к int или long, но не имеет переопределенного operator+ с int.

Если смотреть описание возвращаемого типа, то там есть operator+ с каким-то streamoff, а с int - ничего нет. Там, правда, не указано, что есть опретор преобразования к int, так что это, наверно, тоже лучше не использовать.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
попробуйте так: 2 + telg() На gcc вроде прокатывает без предупреждений.
Но это опасно, т.к. tellg может вернуть ошибку (-1) и она в этом случае останется а) необработанной б) ваш код не поймет, что была ошибка - выражение вернет корректное положительное не правильное значение. Возможно именно по этому выдается предупреждение (в GCC предупреждение, а не ошибка).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы