Ошибка компиляции при использовании двух typename в классе шаблона
Я использую Arduino 1.8.5 ide. Я просто создаю класс с двумя typename, который называется "Map". Этот класс принимает все вариации int и String. Например;
class Map<int, int>;
class Map<int, String>;
class Map<String, int>;
class Map<String, String>;
Map<int, String> *list = new Map<int, String>();
Если я создам экземпляр этого класса, как указано выше, в файле Main.ino, то все будет ок. Но если я создам другой файл с расширением .h, который называется "Test.h", то компиляция не удастся. Это файлы;
Main.ino
#include "Map.h"
#include "Test.h"
Test *test = new Test();
Map<int, String> *list = new Map<int, String>();
void setup() {
}
void loop() {
}
Карта.cpp
#include "Arduino.h"
#include "Map.h"
template<typename E, typename T> Map<E, T>::Map()
{
}
template class Map<int, int>;
template class Map<int, String>;
template class Map<String, int>;
template class Map<String, String>;
Карта.h
#ifndef Map_h
#define Map_h
#include "Arduino.h"
template<typename E, typename T> class Map {
public:
Map();
~Map();
};
#endif
Тест.h
#ifndef _Test_h
#define _Test_h
#include "Arduino.h"
#include "Map.h"
class Test
{
public :
Test();
~Test();
Map<int, String> *list = new Map<int, String>();
};
#endif
Ошибка:
In file included from C:\Users\zafer\Desktop\Main\Main.ino:3:0:
Test.h:14: error: expected ';' at end of member declaration
Map<int, String> *list = new Map<int, String>();
^
Test.h:14: error: expected unqualified-id before '>' token
Map<int, String> *list = new Map<int, String>();
^
Test.h:14: error: wrong number of template arguments (1, should be 2)
Map<int, String> *list = new Map<int, String>();
^
In file included from C:\Users\zafer\Desktop\Main\Main.ino:2:0:
Map.h:6: error: provided for 'template<class E, class T> class Map'
template<typename E, typename T> class Map {
^
exit status 1
expected ';' at end of member declaration
Извините, если проблема уже была решена, но я не смог ее найти.
Спасибо.
@Zafer Yilmaz, 👍0
1 ответ
Лучший ответ:
▲ 3
В этом объявлении класса:
class Test
{
public :
Test();
~Test();
Map<int, String> *list = new Map<int, String>();
};
Эта строка неверна:
Map<int, String> *list = new Map<int, String>();
Вы не можете выполнить процедурный код при объявлении класса. Это должно быть в конструкторе или какой-то другой функции.
Например, это компилируется без ошибок:
Тест.h
#ifndef _Test_h
#define _Test_h
#include "Arduino.h"
#include "Map.h"
class Test
{
public :
Test() { list = new Map<int, String>; } ;
~Test();
Map<int, String> *list;
};
#endif
,
@Nick Gammon
Смотрите также:
- Ошибка: expected unqualified-id before 'if'
- ошибка: expected primary-expression before '(' token
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Ошибка: Переменная или поле объявлены недействительными
- Не могу использовать uint16_t в библиотеке
- Не удалось скомпилировать библиотеки c++11, несмотря на добавление-std=c++11 в platform.txt
- Arduino expected ')' before '{' токен
- Возврат структуры из функции порождает ошибку компиляции "does not name a type"