Форум программистов, компьютерный форум CyberForum.ru

warning: ISO C++ says that these are ambiguous - C++

Восстановить пароль Регистрация
 
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
25.10.2012, 22:51     warning: ISO C++ says that these are ambiguous #1
Вечер добрый.
Помогите раскрыть причину неоднозначности:
Действие:
C++
1
2
3
4
5
6
7
8
9
10
Matrix1 &Matrix1::mult(const Matrix1 &other)
{
    Matrix1 m;
    m.setRow1(mult(other.column1()));
    m.setRow2(mult(other.column2()));
    m.setRow3(mult(other.column3()));
    m.setRow4(mult(other.column4()));
    this->operator = (m);
    return *this;
}
Смысловые члены:
Для класса Matrix1
Прототипы для ф-ии mult и похожей на нее -> неоднозначность возникать не должна...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   /**
      * Ф-ия умножения текущей матрицы на другую матрицу
      *     Текущая матрица находится слева
      * @param other Адрес матрицы для умножения
      * @return Адрес текущей матрицы
      */
    Matrix1 &mult(const Matrix1 &other);
 
   /**
      * Ф-ия умножения матрицы на вектор
      *     Вектор находится справа
      * @param v Адрес вектора для умножения
      * @return Полученный вектор
      */
    Vec1 mult(const Vec1 &v) const;
C++
1
2
inline void setRow1(const Vec1 &val)
    { c->setX(val.x()); (c + 1)->setX(val.y()); (c + 2)->setX(val.z()); (c + 3)->setX(val.d()); }
C++
1
Vec1 *c;    /**< Указатель на первую колонку матрицы */
C++
1
2
3
4
PROPERTY(Vec1, column1, Column1, *c)
PROPERTY(Vec1, column2, Column2, *(c + 1))
PROPERTY(Vec1, column3, Column3, *(c + 2))
PROPERTY(Vec1, column4, Column4, *(c + 3))
Для класса Vec1
C++
1
2
3
4
PROPERTY(dim, x, X, *v)
PROPERTY(dim, y, Y, *(v + 1))
PROPERTY(dim, z, Z, *(v + 2))
PROPERTY(dim, d, D, *(v + 3))
C++
1
dim *v; /**< Указатель на первую строку столбца координат */
Где
C++
1
2
3
4
5
6
7
8
9
10
11
12
/**
  * @def PROPERTY(Type, Name, UpperCaseName, Val)
  * @brief Макрос позволяет определить для класса свойство
  * @param Type Тип возвращаемого и примнимаемого значения
  * @param Name Имя свойства
  * @param UpperCaseName Имя свойства с первой буквой в верхнем регистре
  * @param Val Имя переменной для возврата значения
  */
#define PROPERTY(Type, Name, UpperCaseName, Val)\
    inline Type Name() const { return Val; }\
    inline void set##UpperCaseName(const Type &val){ Val = val; }
typedef float dim;
Очень раздражают эти четыре варнинга. Причины не вижу. С указателями вроде правильно работаю. А дальше типизация вся выстраивается однозначно...
Но, видать, компилятор так не считает.
GCC 4.7.1

Добавлено через 20 минут
Так, причина найдена:
Ф-ия column1() возвращает вместо указателя на объект типа Vec1 сам объект. Соответственно при попытке взять адрес этого объекта может возникнуть ошибка тк он уже может быть к тому времени уничтожен.

Тогда теперь вопрос сводится к тому, как мне корректно преобразовать возвращаемый ф-иями Vec1 к (const Vec1 &) без лишних копирований и гарантией того, что объект действительно существует.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 22:51     warning: ISO C++ says that these are ambiguous
Посмотрите здесь:

C++ ambiguous call to overloaded function
C++ ambiguous access to overloaded function POCHEMU?!?
'sqrt' : ambiguous call to overloaded function C++
error: call of overloaded ‘Function’ is ambiguous C++
Как понимать предупреждение комилятора gcc "ISO C++ says that these are ambiguous." C++
C++ Reference is ambiguous
Ошибка reference is ambiguous C++
C++ Warning C4101 и warning C4996

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 08:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru