LINUX.ORG.RU

Почему не компилируется C++ код?


0

0

Код:
class A {
    public:
        A(int a) {
        }
};

A& operator % (A& x, int y) {
    return x;
}

int main() {
    A s = A(1) % 2;
}

anton@hoo:~/optest$ g++ test.cpp
test.cpp: In function 'int main()':
test.cpp:12: error: no match for 'operator%' in 'A(1) % 2'
test.cpp:7: note: candidates are: A& operator%(A&, int)

anton@hoo:~/optest$ g++ --version
g++ (GCC) 4.1.0 (Debian 4.1.0-1+b1)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
anonymous

Потому что в C++ нельзя передавать временные объекты как не const 
ссылки.

Сделай так:

const A& operator% (const A& x, int y) {
    return x;
}

Или так:

int main()
{
    A a = A(1);
    A s = a % 2;
}

dissident ★★
()
Ответ на: комментарий от imp

Спасибо, уже разобрался. По стандарту оказывается нельзя неконстантные ссылки на времнные обьекты делать. А в Microsoft C++ можно... :)

anonymous
()
Ответ на: комментарий от Reset

Саттер - это который футболист или политолог? ;) Зная M$ - могу лишь предположить, что это был первый, потому как второй что-нибудь бы да написал :)

e
()
Ответ на: комментарий от Reset

Да не, была молодость когда и Александреску читали и Страуструпа аки мантры помнили... надоело ;) Но диалект от M$ - бай дефолт извращенный и мерзкий.

e
()
Ответ на: комментарий от Reset

>msvc менее строг, однако стандарт он поддерживает в большем объеме чем >gcc

Просто для интересу, примеры можно ? :)

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Хотя пример сам только что сгенерил (но он что-то не очень убедительный :)) )

#include "stdio.h"

int main(int argc, char **argv) {
    printf("\n%d\n", sizeof(void));
}

gcc всех версий компиляет, а студия (после 6) нет.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

>gcc всех версий компиляет,

а вот g++ не компиляет. Стандарт по с, наверно, ничего про incomplete type не говорит ...

Всё же примеры какие ?

vtVitus ★★★★★
()
Ответ на: комментарий от sf

ты плохо читал Саттера, добавление треугольных скобок никак не сказывается на компиляции gcc :) Да, студия 7.1 почему-то разучилась (хотя я лично не проверял) компилять такое (со скобками), однако 7.0 и 8.0 умеют.

Reset ★★★★★
()
Ответ на: комментарий от sf

Ну, вобщем, я пробовал на g++-4.1.1. 3.4.6 не берет :].

sf ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.