template <class T>: error: 'T' does not name a type
template <class T>: error: 'T' does not name a type
我正在尝试编译一些在 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;
}
我得到的错误是:
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]
有人能给我指出正确的方向吗?
谢谢。
此代码段在 GCC/Linux 和 MSVS 2015/Windows.
下编译良好
问:对你有用吗? Arduino IDE 可以吗?
问:使用 Arduino (Visual Micro) "error: 'T' does not name a type" 会失败吗?你接触过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");
}
我想我得到了答案。您需要手动为 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 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"
要了解更多信息,请阅读 here。
我正在尝试编译一些在 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;
}
我得到的错误是:
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]
有人能给我指出正确的方向吗?
谢谢。
此代码段在 GCC/Linux 和 MSVS 2015/Windows.
下编译良好问:对你有用吗? Arduino IDE 可以吗?
问:使用 Arduino (Visual Micro) "error: 'T' does not name a type" 会失败吗?你接触过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");
}
我想我得到了答案。您需要手动为 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 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"
要了解更多信息,请阅读 here。