C++ два или более типа данных в объявлении

Я получаю странную ошибку от g++ 3.3 в следующем коде:

#include <bitset>
#include <string>

using namespace std;

template <int N, int M>
bitset<N> slice_bitset(const bitset<M> &original, size_t start) {
    string str = original.to_string<char, char_traits<char>, allocator<char> >();
    string newstr = str.substr(start, N);
    return bitset<N>(newstr);
}

int main() {
    bitset<128> test;
    bitset<12> result = slice_bitset<12, 128>(test, 0);
    return 0;
}

Ошибка следующая:

In function `std::bitset slice_bitset(const std::bitset&, unsigned int)':
syntax error before `,' token
`char_traits' specified as declarator-id
two or more data types in declaration of `char_traits'
`allocator' specified as declarator-id
two or more data types in declaration of `allocator'
syntax error before `>' token

Это должно быть что-то действительно глупое, но я уже сказал это своей резиновой утке и другу, но безрезультатно.

Спасибо, Lazyweb.

+1 за то, что сказал это своей резиновой утке.

Robert 03.12.2009 22:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
14 643
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте либо просто

original.to_string();

или, если вам действительно нужны спецификаторы типа,

original.template to_string<char, char_traits<char>, allocator<char> >();

В этом случае to_string не имеет спецификации по умолчанию, но ваш последний ответ работает! Спасибо.

cdleary 24.10.2008 03:18

Для меня скомпилировано следующее (с использованием gcc 3.4.4):

#include <bitset>
#include <string>

using namespace std;

template <int N, int M> 
bitset<N> slice_bitset(const bitset<M> &original, size_t start) 
{   
  string str = original.to_string();
  string newstr = str.substr(start, N);    
  return bitset<N>(newstr);
}

int main() 
{ 
  return 0; 
}

Да, но он не будет компилироваться, если вы действительно вызовете функцию и оцените параметры шаблона.

cdleary 24.10.2008 03:27

Добавление #include <iostream> и изменение main в этом скомпилированном (с gcc 4.0.1): int main () {bitset <4> orig; orig.set (0,0); orig.set (1,1); ориг. набор (2,0); orig.set (3,1); битовый набор <2> бит = slice_bitset <2,4> (ориг., 2); cout << bits.to_string () << endl; возврат 0; } Какую ошибку вы получаете?

Tim Stewart 24.10.2008 08:44

Я получаю ту же ошибку, что и выше. Однако я использую g ++ 3.3 - они, возможно, обновили stdlib в g ++, чтобы включить параметр шаблона по умолчанию в 3.4, но cplusplus.com говорит, что «они не выводятся неявно компилятором». (cplusplus.com/reference/stl/bitset/to_string.html)

cdleary 25.10.2008 02:45
Ответ принят как подходящий

Выбранный ответ из CAdaker выше решает проблему, но не объясняет, что Почему решает проблему.

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

template <typename T>
class B;

template <typename T>
void foo (B<T> & b) {
  // Use 'b' here, even though 'B' not defined
}

template <typename T>
class B
{
  // Define 'B' here.
};

Однако эта «особенность» имеет свою цену, и в данном случае определение «foo» требует подсказок по содержанию шаблона «B». Если 'foo' использует вложенный тип 'B', то ключевое слово typename необходимо, чтобы сообщить компилятору, что имя является типом:

template <typename T>
void foo (B<T> & b)
{
  typename B<T>::X t1;    // 'X' is a type - this declares t1
  B<T>::Y * t1;           // 'Y' is an object - this is multiplication
}

Без «typename» в приведенном выше компилятор будет считать, что X является объектом (или функцией).

Точно так же, если вызывается функция-член и у вызова есть явные аргументы шаблона, компилятор должен знать, что < следует рассматривать как начало списка аргументов шаблона, а не как оператор «меньше чем»:

template <typename T>
void foo (B<T> & b)
{
  b.template bar<int> (0); // 'bar' is a template, '<' is start of arg list
  b.Y < 10;                // 'Y' is an object, '<' is less than operator
}

Без template компилятор предполагает, что < является оператором «меньше», и поэтому генерирует синтаксическую ошибку, когда видит int>, поскольку это не выражение.

Эти подсказки необходимы выравнивать, когда определение шаблона видно. Причина в том, что явная специализация может позже изменить фактически выбранное определение:

template <typename T>
class B
{
  template <typename S>
  void a();
};

template <typename T>
void foo (B<T> & b)
{
  b.a < 10;            // 'B<int>::a' is a member object
}

template <>
class B<int>
{
  int a;
};

Другие вопросы по теме