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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация объекта pair<T,T> без конструктора T 
V
    Опции темы
Dims
Дата 7.12.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Хочу создать пару из объектов, в классах которых нет конструктора по умолчанию, так что строка

Код

pair<CSpecSizeModel,CSpecSizeModel> ans;


вызывает ошибку no appropriate default constructor available где-то в глубинах STL

Это логично. Поэтому я пишу

Код

pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));


поскольку конструктор CSpecSizeModel принимает 1 целочисленный параметр.

Но и это вызывает ошибку error C2086: 'CSpecSizeModel i' : redefinition

Почему?


PM MAIL   Вверх
Lazin
Дата 7.12.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Попробуй воспользоваться ф-й 
Код

std::make_pair( CSpecSizeModel(i), CSpecSizeModel(i) );


Добавлено через 1 минуту и 5 секунд
возможно компилятор принимает 
Цитата(Dims @  7.12.2007,  10:20 Найти цитируемый пост)
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));

за объявлени функции, хотя я не уверен в этом....
PM MAIL Skype GTalk   Вверх
Dims
Дата 7.12.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



1) Сперва я сделал тайпдеф:

Код

typedef pair<CSpecSizeModel,CSpecSizeModel> CPairOfSpecSizeModels;


не помогло.

2) Потом я записал вот так

Код

CPairOfSpecSizeModels ans = CPairOfSpecSizeModels(CSpecSizeModel(i),CSpecSizeModel(i));


и тогда стало компилироваться.
PM MAIL   Вверх
UnrealMan
Дата 7.12.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lazin @ 7.12.2007,  10:40)
возможно компилятор принимает 
Цитата(Dims @  7.12.2007,  10:20 Найти цитируемый пост)
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));

за объявлени функции

Это действительно объявление функции.

Добавлено через 2 минуты и 36 секунд
Если конструктор CSpecSizeModel для i не является explicit, то достаточно будет записать так:

Код

std::pair<CSpecSizeModel, CSpecSizeModel> ans(i, i);

PM MAIL   Вверх
Alek86
Дата 7.12.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



а можно полюбопытствовать в роли чего в
Код
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));

выступает i ?


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 7.12.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В роли имени параметра функции smile
PM MAIL   Вверх
Alek86
Дата 7.12.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



а тип где?

Добавлено через 26 секунд
или я чето не догоняю....

просьба сжалиться и объяснить чуть подробнее smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 7.12.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



В стандарте написано, все что может быть объявлением, должно быть объявлением. поэтому код:
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));
компилятор видит, как:
type1 ans(type2 (i), type2(i));
Из которого убираются лишние скобки:
type1 ans(type2 i, type2 i);
и лишние имена переменных:
type1 ans(type2, type2);
А это уже объявление функции.
PM   Вверх
bsa
Дата 7.12.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Сильно меня перехваливать не стоит. Я позаимствовал этот способ демонстрации из книги: "Герб Саттер - Новые сложные задачи на C++"
PM   Вверх
JackYF
Дата 7.12.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Кажись, никто не осветил собственно решение этой коллизии, вот оно (взято, естественно, всё оттуда же):
Код

pair<CSpecSizeModel,CSpecSizeModel> ans((CSpecSizeModel(i)),(CSpecSizeModel(i)));



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 7.12.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Слишком много скобок. Проще C-каст сделать.
PM MAIL   Вверх
JackYF
Дата 7.12.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(UnrealMan @  7.12.2007,  22:38 Найти цитируемый пост)
Проще C-каст сделать. 

Нет уж, хватит с меня С-кастов...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
baldina
Дата 8.12.2007, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата

Слишком много скобок. Проще C-каст сделать. 


а чем
std::pair <X,X> p = std::make_pair(X(i), X(i));
не подходит?

Это сообщение отредактировал(а) baldina - 8.12.2007, 03:24
PM MAIL   Вверх
UnrealMan
Дата 8.12.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(baldina @  8.12.2007,  03:15 Найти цитируемый пост)
а чем
std::pair <X,X> p = std::make_pair(X(i), X(i));
не подходит?

Много буков smile

Добавлено @ 11:36
Цитата(JackYF @  7.12.2007,  23:50 Найти цитируемый пост)
Нет уж, хватит с меня С-кастов... 

А чем функциональное преобразование лучше?

Это сообщение отредактировал(а) UnrealMan - 8.12.2007, 11:37
PM MAIL   Вверх
JackYF
Дата 8.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(UnrealMan @  8.12.2007,  11:34 Найти цитируемый пост)
А чем функциональное преобразование лучше?

тем, что оно ограничивает область преобразования. Тем, что я знаю, делает ли компилятор физические преобразования (static_cast), логические (reinterpret_cast), вниз по иерархии классов (dynamic_cast), или же опасную отмену константности (const_cast).

Разделение обязанностей. Разделяй и властвуй.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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