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

Кортеж с абстрактным типом как параметр шаблона + smart_ptr - C++

Восстановить пароль Регистрация
 
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.05.2013, 09:43     Кортеж с абстрактным типом как параметр шаблона + smart_ptr #1
Имеем кортеж (std::tuple) с абстрактным типом, параметризуем этим шаблон класса, экземпляров кортежа нигде не создаём. Создаём экземпляры параметризованного шаблона: на стеке - ок, в куче - ок, но когда используем std::[unique/shared]_ptr - получаем ошибку компиляции от куда то из недр std::tuple - "нельзя объявить поле абстрактного типа". gcc-4.7.2 .
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <tuple>
#include <memory>
 
 
template<typename T>
struct holder {};
 
struct abstract {
 
   virtual ~abstract() = 0;
};
 
abstract::~abstract() {}
 
 
int main() {
   using types     = std::tuple<abstract>;
   using holder_t  = holder<types>;
 
   // Ok
   holder_t local;
 
   // Ok
   new holder_t;
 
   // ?
   std::unique_ptr<holder_t> unique(new holder_t);
 
   // ?
   std::make_shared<holder_t>();
}
http://ideone.com/7Qkm2E

ошибки
Код
In file included from prog.cpp:1:0:
/usr/include/c++/4.7/tuple: In instantiation of ‘struct std::_Head_base<0u, abstract, false>’:
/usr/include/c++/4.7/tuple:215:12:   required from ‘struct std::_Tuple_impl<0u, abstract>’
/usr/include/c++/4.7/tuple:374:11:   required from ‘class std::tuple<abstract>’
/usr/include/c++/4.7/tuple:744:35:   required from ‘constexpr typename std::__add_ref<typename std::tuple_element<__i, std::tuple<_Elements ...> >::type>::type std::get(std::tuple<_Elements ...>&) [with unsigned int __i = 0u; _Elements = {holder<std::tuple<abstract> >*, std::default_delete<holder<std::tuple<abstract> > >}; typename std::__add_ref<typename std::tuple_element<__i, std::tuple<_Elements ...> >::type>::type = holder<std::tuple<abstract> >*&]’
/usr/include/c++/4.7/bits/unique_ptr.h:171:32:   required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = holder<std::tuple<abstract> >; _Dp = std::default_delete<holder<std::tuple<abstract> > >]’
prog.cpp:28:49:   required from here
/usr/include/c++/4.7/tuple:166:13: error: cannot declare field ‘std::_Head_base<0u, abstract, false>::_M_head_impl’ to be of abstract type ‘abstract’
prog.cpp:9:8: note:   because the following virtual functions are pure within ‘abstract’:
prog.cpp:14:1: note: 	virtual abstract::~abstract()

Я не могу понять, в чём конкретно причина, видимо где то создаётся экземпляр кортежа. Так и должно быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2013, 09:43     Кортеж с абстрактным типом как параметр шаблона + smart_ptr
Посмотрите здесь:

передать шаблонный класс как параметр шаблона C++
C++ В чем смысл создания шаблона с заранее известным передаваемым типом
Зачем нужен шаблон как параметр шаблона? C++
Как ограничить параметр типа шаблона только числовыми типами данных? C++
Указатель на статический массив как параметр шаблона C++
C++ Параметр шаблона ostream_iterator по умолчанию
C++ Как сделать код абстрактным
Быстрее ли вывов функции, переданной через параметр шаблона, чем через простой указатель на функцию? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.05.2013, 10:22     Кортеж с абстрактным типом как параметр шаблона + smart_ptr #2
в VS2012 этот код с unique_ptr работает, с шаред уже нет и по той же причине
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.05.2013, 21:26  [ТС]     Кортеж с абстрактным типом как параметр шаблона + smart_ptr #3
Странно. Вот так, например, всё нормально:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <tuple>
#include <memory>
 
 
template<typename Type>
struct identity {
 
   using type = Type;
};
 
template<typename...>
struct holder {};
 
template<typename ...Types>
struct holder<std::tuple<identity<Types>...>> {};
 
 
struct abstract {
 
   virtual ~abstract() = 0;
};
 
abstract::~abstract() {}
 
 
int main() {
   using types     = std::tuple<identity<abstract>>;
   using holder_t  = holder<types>;
 
   // Ok
   holder_t local;
 
   // Ok
   new holder_t;
 
   // ?
   std::unique_ptr<holder_t> unique(new holder_t);
 
   // ?
   std::make_shared<holder_t>();
}
http://ideone.com/5IVqd6
Yandex
Объявления
13.05.2013, 21:26     Кортеж с абстрактным типом как параметр шаблона + smart_ptr
Ответ Создать тему

Метки
g++, std::tuple, template, с++11
Опции темы

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