Std::vector<>::push_back вызывает ошибку ссылки на Arduino

Я использую эту функцию для копирования одного вектора в конец другого:

template <typename T, typename U>
void addVectorToVector(std::vector<T>* oldVector, std::vector<U> input){
  for(uint8_t i = 0; i < Input(size); i++){
    T inputVar = (T) Input[i];
    oldVector->push_back(inputVar);
  }
return;
}

Это вызывает ошибку компиляции в Arduino IDE:

C:\Users\ehle_ta\AppData\Local\Temp\arduino_build_330682\sketch\main.ino.cpp.o: In function `std::vector<unsigned char, std::allocator<unsigned char> >::_M_check_len(unsigned int, char const*) const':

c:\program files (x86)\arduino\hardware\tools\arm\arm-none-eabi\include\c++\5.4.1\bits/stl_vector.h:1425: undefined reference to `std::__throw_length_error(char const*)'

collect2.exe: error: ld returned 1 exit status

Я могу сказать, что ошибка исчезает, когда я комментирую

oldVector->push_back(inputVar);

но я не понимаю, почему эта ошибка ссылки происходит.

редактировать:

Ошибка может быть вызвана компиляцией этого кода:

#include <vector>
void setup() {
  std::vector<unsigned char> vector1;
  std::vector<unsigned char> vector2;
  vector2.push_back(0x01);
  vector2.push_back(0x02);
  addVectorToVector(&vector1, vector2); 
}
// add the content of a vector to the end of another vector
template <typename T, typename U>
void addVectorToVector(std::vector<T>* oldVector, std::vector<U> input){ 
  for(uint8_t i = 0; i < input.size(); i++){
    T inputVar = (T) input[i];
    oldVector->push_back(inputVar);
  }
  return;
}

Есть ли ошибка в моей реализации/использовании vector::push_back или возможно, что класс std::vector, который я использую, не является стандартным С++ 11 и, следовательно, вызывает проблемы?

Что такое Input? Это должно быть input? Что такое Input(size)? Опубликуйте минимальный воспроизводимый пример. Почему нельзя использовать vector::insert?

Praetorian 07.03.2019 15:36

Добро пожаловать в Stack Overflow! Пожалуйста, редактировать ваш вопрос с минимальный воспроизводимый пример или SSCCE (короткий, автономный, правильный пример)

NathanOliver 07.03.2019 15:36

как вы можете скомпилировать этот код? Input(size) это input.size() ? Input это input (но тип U и T при получении элемента)? Вы уверены, что предоставили нам исходный код, который вы скомпилировали, а затем связали? uint8_t для индекса — не лучший выбор.

bruno 07.03.2019 15:36

Ошибка в том, что компоновщик не может найти функцию STL, которая выдает ошибку длины (судя по ее названию), а не саму ошибку длины. Это должно быть нарушение байт-кода в файлах STL .lib, поскольку отсутствует только часть STL.

Kotauskas 07.03.2019 15:37

Как бы то ни было, это ошибка, которая обычно возникает при попытке скомпилировать/связать C++ исходный код с помощью C компилятора, что приводит к связыванию со стандартной C библиотекой, а не с C++ эквивалентом.

G.M. 07.03.2019 15:49

Я думал, что загадочное сообщение об ошибке было вызвано тем фактом, что Arduino не поддерживает систему C++ exception/try/catch. Я использую новую установку Arduino с надстройкой Teensyduino.

tobeh 07.03.2019 15:51

@tobeh вы не можете использовать std::vector в IDE arduino, не импортировав каким-либо образом стандартную библиотеку самостоятельно. См. комментарий О'Нила.

Sailanarmo 07.03.2019 17:54
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
8
1 157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это

template <typename T, typename U>
void addVectorToVector(std::vector<T>* oldVector, std::vector<U> &input) 
{
    for (int i = 0; i < input.size(); i++) {
        T inputVar = (T) input[i];
        oldVector->push_back(inputVar);
    }

}

это, к сожалению, дает мне ту же самую ошибку

tobeh 07.03.2019 16:00

который правильно компилируется в C++, поэтому, возможно, есть ошибка ссылки

Aris 07.03.2019 16:11

Спасибо, что попробовали это. Я предполагаю, что это ответ.

tobeh 07.03.2019 16:46

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