Пропуск C++ обрабатывает параметр по шаблону

Переполнение стека означает точно что: переполнения стека. Обычно существует один стек в программе, которая содержит переменные локального объема и адреса, куда возвратиться, когда выполнение стандартной программы заканчивается. Тот стек имеет тенденцию быть диапазоном постоянной памяти где-нибудь в памяти, поэтому это ограничено, насколько это может содержать значения.

, Если стек пуст, Вы не можете появиться, если Вы сделаете то Вы получите ошибку выхода за нижнюю границу стека.

, Если стек полон, Вы не можете продвинуть, если Вы сделаете то Вы получите ошибку переполнения стека.

, Таким образом, переполнение стека появляется, где Вы выделяете слишком много в стек. Например, в упомянутой рекурсии.

Некоторые реализации оптимизируют некоторые формы рекурсий. Хвостовая рекурсия в частности. Рекурсивные стандартные программы хвоста являются формой стандартных программ, где рекурсивный вызов появляется как заключительная вещь, что делает стандартная программа. Такой стандартный вызов просто уменьшается в переход.

Некоторые реализации идут, насколько реализуют их собственные стеки для рекурсии, поэтому они позволяют рекурсии продолжаться, пока система не исчерпывает память.

Самая Легкая вещь, которую Вы могли попробовать, будет состоять в том, чтобы увеличить Ваш размер стека, если Вы можете. Если Вы не можете сделать этого, хотя, почти лучшая вещь состояла бы в том, чтобы посмотреть, существует ли что-то, что ясно вызывает переполнение стека. Попробуйте его путем печати чего-то прежде и после вызова в стандартную программу. Это помогает Вам узнать провальную стандартную программу.

7
задан jameszhao00 14 August 2009 в 04:21
поделиться

3 ответа

Там один прием, который вы можете использовать, который, по крайней мере, избавит вас от необходимости определять значение по умолчанию, но для этого требуется, чтобы вы знали имя типа, как оно определено в hash_map .

hash_map вероятно, будет объявлено что-то вроде:

class allocator {};
class hash_compare {};

template<typename Key
  , typename T
  , typename HashCompare = hash_compare
  , typename Allocator = allocator>
class hash_map
{
public:
  typedef HashCompare key_compare;
  // ...
};

Мы не можем оставить значение по умолчанию для хэша, но мы можем ссылаться на значение по умолчанию, используя typedef члена:

hash_map<EntityId
  , Entity*
  , hash_map<EntityId,Entity*>::key_compare  // find out the default hasher
  , tbb::scalable_allocator> hm;

Если вы собираетесь много использовать тип, тогда создайте typedef:

typedef hash_map<EntityId,Entity*>::key_compare EntityKeyCompare;

hash_map<EntityId
  , Entity*
  , EntityKeyCompare
  , tbb::scalable_allocator> hm;
4
ответ дан 6 December 2019 в 10:02
поделиться

Если у типа карты есть некоторый общедоступный typedef для параметра шаблона HashCompare , вы можете написать мета-функцию, которая использует тип хэш-карты vanilla чтобы получить стандартный компаратор. Примерно так:

template< typename Key, typename T, typename Allocator>
struct hash_map_type {
  typedef typename hash_map<Key,T>::key_compare key_compare;
  typedef mash_map<Key,T,key_compare,Allocator> result_t;
};

typedef hash_map_type<int,string,my_allocator>::result_type my_hash_map;

Это, однако, зависит от того, что hash_map :: key_compare выше доступно.

3
ответ дан 6 December 2019 в 10:02
поделиться

Простой ответ - вы не можете. Вы не можете пропустить параметр шаблона и выбрать для него значение по умолчанию. Единственный вариант - узнать, что такое значение по умолчанию, и вставить его в свое объявление.

12
ответ дан 6 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: