Я создал аксессуар в своем классе SparseMatrix. Я пытаюсь написать функцию-член symmetric, и я хотел бы получить доступ с помощью моего средства доступа к закрытым данным класса в моей симметричной функции.

У меня есть транспонируемая функция-член, и this->transpose() работает так, как я думал. Итак, я попробовал this->[], но, конечно, это не сработало. Наверное, потому что это перегрузка оператора.

bool SparseMatrix::symmetric() const
{
  SparseMatrix A_T(m_m,m_n);
  A_T = this->transpose();
  bool is_symmetric;
  for (int row=0; row<m_m; ++row)
    {
      int cols = A_T.m_colIndex[row].size();
      for (int col=0; col<cols; ++col)
        {
          array<int, 2> A_tuple  = {row,m_colIndex[row][col]};
          array<int, 2> A_T_tuple  = {row,A_T.m_colIndex[row][col]};
          if (A_T[A_T_tuple] == this->operator[](A_tuple))
            {
              is_symmetric = true;
            }
...

Добавлен еще код для ясности.

Вот сообщение об ошибке.

Undefined symbols for architecture x86_64:
  "SparseMatrix::operator[](std::__1::array<int, 2ul>&) const", referenced from:
      SparseMatrix::symmetric() const in SparseMatrix.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
-2
zstreet 9 Окт 2019 в 08:29
Пожалуйста, будьте более конкретными, чем «это не работает».
 – 
molbdnilo
9 Окт 2019 в 08:33
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он был решен в комментариях, а проблема заключается в коде, который не был опубликован.
 – 
anatolyg
9 Окт 2019 в 10:00

2 ответа

Я прав, что this реализует operator[]? В таком случае используйте this->operator[](/*arguments*/) вместо this->[]

0
P. Dmitry 9 Окт 2019 в 08:33

Просто поставьте звездочку внутри фигурных скобок:

(*this)[some_index];

Это необходимо, потому что оператор разыменования * имеет более низкий приоритет, чем оператор нижнего индекса.


Кажется, у вас объявлена, но не определена const версия operator[], учитывая, что вы получаете ошибку ссылки, а не ошибку компиляции. Вам необходимо предоставить тело для этого operator[]() const, чтобы вы могли использовать его из своего метода symmetric. Вы не можете использовать неконстантный оператор из константного метода.

0
r3mus n0x 9 Окт 2019 в 09:03
Это почти скомпилировалось. Это ошибка, которую я получаю. "SparseMatrix :: operator [] (std :: __ 1 :: array &) const", ссылка на которую имеется: SparseMatrix :: symric () const в SparseMatrix.o
 – 
Zachary 42
9 Окт 2019 в 08:38
@ Zachary42, пожалуйста, предоставьте более полное сообщение об ошибке.
 – 
r3mus n0x
9 Окт 2019 в 08:42
Неопределенные символы для архитектуры x86_64: «SparseMatrix :: operator [] (std :: __ 1 :: array &) const», ссылка на которую осуществляется из: SparseMatrix :: symric () const в SparseMatrix.o ld: symbol (s ) не найден для архитектуры x86_64 clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
 – 
Zachary 42
9 Окт 2019 в 08:43
Аксессор не является константным, и я уже использовал его, поэтому знаю, что он работает.
 – 
Zachary 42
9 Окт 2019 в 08:44
@ Zachary42, похоже, у вас объявлен, но не определен метод доступа const (нет тела). Вы не можете использовать неконстантный метод доступа из константного метода symmetric.
 – 
r3mus n0x
9 Окт 2019 в 08:47