Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GCC не находит конструктор, ошибка сборки, нидхелп 
:(
    Опции темы
Snape
Дата 20.5.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.5.2011

Репутация: нет
Всего: нет



Есть структура:

Код

struct fVec3 {
        union { struct { float x, y, z; }; struct { float r, g, b; }; float v[3]; };
        WCS_GEOMETRY_BASIC_CONSTRUCTORS3(fVec3, float)
};


Есть макрос, изначально тут было много темплейтов, убрал для наглядности, расписав все вручную:

Код

#define WCS_GEOMETRY_BASIC_CONSTRUCTORS3(STRUCT, TYPE) STRUCT() : x(0), y(0), z(0) {} \
\
STRUCT(char i) : x((TYPE)i), y((TYPE)i), z((TYPE)i) {} \
STRUCT(float i) : x((TYPE)i), y((TYPE)i), z((TYPE)i) {} \
STRUCT(int i) : x((TYPE)i), y((TYPE)i), z((TYPE)i) {} \
STRUCT(uchar i) : x((TYPE)i), y((TYPE)i), z((TYPE)i) {} \
STRUCT(uint i) : x((TYPE)i), y((TYPE)i), z((TYPE)i) {} \
\
explicit STRUCT(char x, char y, char z) : x((TYPE)x), y((TYPE)y), z((TYPE)z) {} \
explicit STRUCT(float x, float y, float z) : x((TYPE)x), y((TYPE)y), z((TYPE)z) {} \
explicit STRUCT(int x, int y, int z) : x((TYPE)x), y((TYPE)y), z((TYPE)z) {} \
explicit STRUCT(uchar x, uchar y, uchar z) : x((TYPE)x), y((TYPE)y), z((TYPE)z) {} \
explicit STRUCT(uint x, uint y, uint z) : x((TYPE)x), y((TYPE)y), z((TYPE)z) {} \
\
explicit STRUCT(char *v) : x((TYPE)v[0]), y((TYPE)v[1]), z((TYPE)v[2]) {} \
explicit STRUCT(float *v) : x((TYPE)v[0]), y((TYPE)v[1]), z((TYPE)v[2]) {} \
explicit STRUCT(int *v) : x((TYPE)v[0]), y((TYPE)v[1]), z((TYPE)v[2]) {} \
explicit STRUCT(uchar *v) : x((TYPE)v[0]), y((TYPE)v[1]), z((TYPE)v[2]) {} \
explicit STRUCT(uint *v) : x((TYPE)v[0]), y((TYPE)v[1]), z((TYPE)v[2]) {} \
\
explicit STRUCT(const cVec2 &v); \
explicit STRUCT(const fVec2 &v); \
explicit STRUCT(const iVec2 &v); \
explicit STRUCT(const ucVec2 &v); \
explicit STRUCT(const uiVec2 &v); \
\
explicit STRUCT(const cVec3 &v); \
explicit STRUCT(const fVec3 &v); \
explicit STRUCT(const iVec3 &v); \
explicit STRUCT(const ucVec3 &v); \
explicit STRUCT(const uiVec3 &v); \
\
explicit STRUCT(const cVec4 &v); \
explicit STRUCT(const fVec4 &v); \
explicit STRUCT(const iVec4 &v); \
explicit STRUCT(const ucVec4 &v); \
explicit STRUCT(const uiVec4 &v);


При попытке использовать структуру (float насильно уже указываю от паники):

Код

    return fVec3(
                                            float(x*(2.0f/255.0f)-1.0f),
                                            float(y*(2.0f/255.0f)-1.0f),
                                            float(0.0f)
                                            );


Получаю отлуп от компилятора:

Код

M:\WCS\_libWCS\src/Types/Geometry/cVec2.h: In member function 'WCS::fVec3 WCS::cVec2::toFVec3() const':
M:\WCS\_libWCS\src/Types/Geometry/cVec2.h:69:45: error: no matching function for call to 'WCS::fVec3::fVec3(WCS::fVec3)'
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note: candidates are: WCS::fVec3::fVec3(uint, uint, uint)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(uchar, uchar, uchar)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(int, int, int)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(float, float, float)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(char, char, char)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(uint)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(uchar)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(int)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(float)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3(char)
M:\WCS\_libWCS\src/Types/Geometry/fVec3.h:31:9: note:                 WCS::fVec3::fVec3()



Поставте, плз, диагноз - в чем заключается мой идиотизм?

Вот такой вариант собирается (хз, будет ли фактически работать, но при сборке проблем нет):

Код

fVec2 cVec2::toFVec() const { return fVec2(x*(2.0f/255.0f)-1.0f, y*(2.0f/255.0f)-1.0f); }


структура, аналогичная fVec3, а конструкторы такие:

Код

#define WCS_GEOMETRY_BASIC_CONSTRUCTORS2(STRUCT, TYPE) STRUCT() : x(0), y(0) {} \
\
STRUCT(char i) : x((TYPE)i), y((TYPE)i) {} \
STRUCT(float i) : x((TYPE)i), y((TYPE)i) {} \
STRUCT(int i) : x((TYPE)i), y((TYPE)i) {} \
STRUCT(uchar i) : x((TYPE)i), y((TYPE)i) {} \
STRUCT(uint i) : x((TYPE)i), y((TYPE)i) {} \
\
template <typename T1, typename T2> explicit STRUCT(T1 x, T2 y) : x((TYPE)x), y((TYPE)y) {} \
\
explicit STRUCT(char *v) : x((TYPE)v[0]), y((TYPE)v[1]) {} \
explicit STRUCT(float *v) : x((TYPE)v[0]), y((TYPE)v[1]) {} \
explicit STRUCT(int *v) : x((TYPE)v[0]), y((TYPE)v[1]) {} \
explicit STRUCT(uchar *v) : x((TYPE)v[0]), y((TYPE)v[1]) {} \
explicit STRUCT(uint *v) : x((TYPE)v[0]), y((TYPE)v[1]) {} \
\
template <typename T> explicit STRUCT(const T &v) : x((TYPE)v.x), y((TYPE)v.y) {}


ЗЫ: Пардон, не гсс, а г++

Это сообщение отредактировал(а) Snape - 20.5.2011, 23:48
PM MAIL   Вверх
Snape
Дата 21.5.2011, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.5.2011

Репутация: нет
Всего: нет



Убрал конструкторы вида:

Код

explicit STRUCT(const cVec2 &v);


Заработало.

Добавил темплейт вида:
Код

template <typename T> explicit STRUCT(const T &o) : x((TYPE)o.x), y((TYPE)o.y) {}


Опять работает.

Но. Чем ему не нравится
Код

explicit STRUCT(const cVec2 &v);

?

Естественно, что соответствующие
Код

inline STRUCT::STRUCT(const cVec2 &v) : x((TYPE)v.x), y((TYPE)v.y), z(0) {} \

в коде присутствуют.

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

Это сообщение отредактировал(а) Snape - 21.5.2011, 00:17
PM MAIL   Вверх
alexvs11
Дата 21.5.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



g++ -E не помогает?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.