template <class T>:错误:'T'没有命名类型

ioa*_*hip 3 c++ arduino visual-studio visual-c++-2010 visual-studio-2015

我正在尝试编译一些在Arduino IDE中编译良好的代码,在Visual Studio中支持Arduino(Visual Micro).这是有问题的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

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]
Run Code Online (Sandbox Code Playgroud)

有人可以指点我正确的方向吗?

谢谢.

Sou*_*jan 6

我想我得到了答案.您需要手动为Visual Studio中的函数添加声明.

template <class T> int EEPROM_writeAnything(int ee, const T& value);
template <class T> int EEPROM_readAnything(int ee, T& value);
Run Code Online (Sandbox Code Playgroud)

但是Arduino IDE会对您的源代码进行预处理,并在场景后自动添加这些代码.所以它适用于Arduino IDE.

提示:在arduino IDE中启用详细输出时,请参阅保存编译期间生成的中间文件的临时路径.它应该类似于%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"
Run Code Online (Sandbox Code Playgroud)

要了解更多信息,请阅读此处.