3

Я пытаюсь скомпилировать код, который компилируется отлично в Arduino IDE, в Visual Studio с поддержкой Arduino (Visual Micro). Это код проблемы:template <class T>: error: 'T' не называет тип

template <class T> int EEPROM_writeAnything(int ee, const T& value) 
{ 
    const byte* p = (const byte*)(const void*)&value; 
    unsigned int i; 
    for (i = 0; i < sizeof(value); i++) 
      EEPROM.write(ee++, *p++); 
    return i; 
} 

template <class T> int EEPROM_readAnything(int ee, T& value) 
{ 
    byte* p = (byte*)(void*)&value; 
    unsigned int i; 
    for (i = 0; i < sizeof(value); i++) 
      *p++ = EEPROM.read(ee++); 
    return i; 
} 

Ошибка я получаю:

app.ino:43:40: error: 'T' does not name a type 
:int EEPROM_writeAnything(int ee, const T& value) 
app.ino:43:43: error: ISO C++ forbids declaration of 'value' with no type [-fpermissive] 

Может кто-то пожалуйста, мне точку в правильном направлении?

Спасибо.

+1

Возможный дубликат [ISO C++ запрещает объявление «что-то» без типа] (http://stackoverflow.com/questions/18670953/iso-c-forbids-declaration-of-something-with-no-type) , Просто добавьте объявление вперед: 'template значение класса;' – paulsm4

+0

@ paulsm4. Я все равно получаю ту же ошибку, даже если я добавляю объявление вперед. –

+0

@Niall Вот весь код до сих пор (я разрабатываю его прямо сейчас, так не делается): http://pastebin.com/24cY69e8 Кроме того, если я прокомментирую код функции шаблона, все компилируется отлично. –

ответ

4

Я думаю, что получил ответ. Вам нужно добавить объявление для функций в Visual Studio вручную.

template <class T> int EEPROM_writeAnything(int ee, const T& value); 
template <class T> int EEPROM_readAnything(int ee, T& value); 

но в то время как Arduino IDE предварительно обработает ваш исходный код и добавит их автоматически для вас за сценой. Так он работает в Arduino IDE.

Подсказка. Когда вы включаете подробный вывод в своей среде разработки arduino, обратитесь к временному пути, в котором сохраняются промежуточные файлы, сгенерированные во время компиляции. Это должно быть что-то вроде% temp% \ build0094e6ca87558f1142f08e49b0685193.tmp \ sketch. Он должен иметь следующие утверждения.

#line 2 "C:\\Users\\Sound\\Documents\\Arduino\\sketch_mar10d\\sketch_mar10d.ino" 
template <class T> int EEPROM_writeAnything(int ee, const T& value); 
#line 11 "C:\\Users\\Sound\\Documents\\Arduino\\sketch_mar10d\\sketch_mar10d.ino" 
template <class T> int EEPROM_readAnything(int ee, T& value); 
#line 21 "C:\\Users\\Sound\\Documents\\Arduino\\sketch_mar10d\\sketch_mar10d.ino" 

Чтобы узнать больше об этом, читайте here.

2

Этот фрагмент компилируется под GCC/Linux и MSVS 2015/Windows.

В: Это сработает для вас? Все в порядке с IDE Arduino?

В: Сбой ошибки: «T» не называет тип «с Arduino (Visual Micro)? Вы связались с Visual Micro?

#include <stdio.h> 

typedef unsigned char byte; 

class A { 
public: 
    void write(int & ee, const byte &p) { } 
}; 

A EEPROM; 

template <class T> int EEPROM_writeAnything(int ee, const T& value) 
{ 
    const byte* p = (const byte*)(const void*)&value; 
    unsigned int i; 
    for (i = 0; i < sizeof(value); i++) 
      EEPROM.write(ee++, *p++); 
    return i; 
} 

int main (int argc, char *argv[]) { 
    printf ("Hello world\n"); 
} 
Смежные вопросы