Ошибка компиляции в C ++ Возможно, проблемы с пространством имен

0

Я считаю, что моя проблема очень фундаментальна, но я не нахожу ее решением. Я пробовал несколько обходных решений. Ошибки, которые я получаю, представляют собой очень длинный список "никакого совпадающего вызова функции". Я почти уверен, что это связано с тем, как я работаю с пространствами имен, но, глядя в онлайн, кажется, что я правильно его форматирую. Пространство имен является требованием для назначения, поэтому я не могу его удалить.

Код:

namespace complexSpc{
    class complex
    {
    public:

        friend complex operator*(complex &, complex &);
    };
}

В нижней части моей программы я определяю своих членов класса. Они не находятся в блоке пространства имен. Я пытался это сделать, но ничего не исправить. Я также попытался переместить определения так, чтобы они были определены, когда они объявлены.

    complexSpc::complex complexSpc :: operator*(complexSpc::complex & first, complexSpc::complex & second)
{
    complexSpc::complex t1 = complexSpc::complex(first.real() * second.real(), first.imag() * second.imag());

    return t1;
}

Ошибка, созданная для этого, выглядит так:

complexFix.cpp: 183: ошибка: нет соответствующей функции для вызова комплекса complexSpc :: complex :: complex (complexSpc :: complex)

Кто-то спросил, есть ли у меня конструктор копирования. Я делаю. Он объявляется в пространстве имен и определяется так:

complex(complex &);


complexSpc::complex::complex(complexSpc::complex & copy)
{
    member1 = copy.real();
    member2 = copy.imag();
    return;
}
  • 3
    уменьшите его до 1 оператора и опубликуйте ошибку.
  • 0
    Снижение. Прости за это
Показать ещё 6 комментариев
Теги:
class
namespaces

2 ответа

1

Измените подпись своего конструктора копий на:

complexSpc::complex::complex(const complexSpc::complex & copy);

Чтобы позволить rvalues комплекса копироваться в оператор return оператора вашего оператора.

Обратите внимание, что вам также придется придерживаться этого принципа для ваших подписей оператора, чтобы иметь возможность использовать их в комбинированных операциях:

complexSpc::complex complexSpc :: operator*
    ( const complexSpc::complex & first
    , const complexSpc::complex & second
    );

Скорее всего, это должно устранить большинство ваших оставшихся ошибок.

  • 0
    я изменил конструктор, как вы сказали, но я должен изменить определение тоже? Извините, я новичок в этом деле
  • 0
    Ага! Конечно, они всегда должны иметь подписи.
Показать ещё 9 комментариев
1

complexFix.cpp: 183: ошибка: нет соответствующей функции для вызова комплекса complexSpc :: complex :: complex (complexSpc :: complex)

В исходный код входит строка:

complexSpc::complex t1 = complexSpc::complex(member1 + second.real(), member2 + second.imag());

Который создает с ним временные, а затем копии-конструкции t1. Однако ваш конструктор копий объявлен:

complex(complex &);

Это означает, что он не может принимать временные аргументы в качестве аргументов, потому что не-const (lvalue) ссылки не могут связываться с временными объектами. Примечание. Visual Studio имеет расширение, которое позволяет временным связям ссылаться на ссылки, не содержащие константы, поэтому он не поймает эту ошибку.

const ссылаются на временные, поэтому, если вы измените конструктор копирования на:

complex(complex const &);

Затем компилятор сможет найти соответствующую функцию, которую он ищет в этом сообщении об ошибке.

Также обратите внимание, что в вашем коде есть много других функций с неконстантными ссылочными параметрами. Они могут не вызывать ошибок, поскольку вы не используете эти функции с временными, но они также должны быть обновлены, чтобы работать с временными.


complexNumbers.cpp: 182: ошибка: 'complexSpc :: complex complexSpc :: operator * (complexSpc :: complex &, complexSpc :: complex &) должен был быть объявлен внутри `complexSpc

Я считаю, что на самом деле это ошибка в компиляторе. Дружеские объявления внутри класса должны быть достаточными, однако gcc, похоже, не справляется с этим во всех случаях. Обходной путь заключается в том, чтобы объявить те функции друга, что это ошибка во второй раз, но вне класса:

namespace N {
  class C {
    friend void f();
  };
  void f(); // workaround.
}
void N::f() {}
  • 0
    я попытался определить это в фигурных скобках, но это ничего не исправило
  • 0
    сейчас гораздо меньше ошибок. те, что я вижу сейчас из текстовой стены, в значительной степени похожи на следующие: complexNumbers.cpp: 182: ошибка: 'complexSpc :: complex complexSpc :: operator * (complexSpc :: complex &, complexSpc :: complex &)' должен иметь был объявлен внутри 'complexSpc'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню