【问题标题】:template <class T>: error: 'T' does not name a type模板 <class T>:错误:“T”没有命名类型
【发布时间】:2016-03-09 17:49:05
【问题描述】:

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

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]

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

谢谢。

【问题讨论】:

  • ISO C++ forbids declaration of "something" with no type 的可能重复项。只需添加前向声明:template &lt;class T&gt; class value;
  • @paulsm4 即使我添加了前向声明,我仍然会遇到同样的错误。
  • 你用的是什么版本的arduino ide?从 Arduino 编译和从 Visual Studio 编译时,您可以粘贴编译命令行吗?我猜他们是不同的。 Visual Micro 只是包装了 Arduino 中使用的底层 gcc 编译器。因此,如果它在 Arduino IDE 中工作,它也应该在 Viusal 工作室中工作。
  • 这可能是工具链中的某些东西...stackoverflow.com/q/18052310/3747990
  • @Niall,是的。我按照那篇文章中的建议创建了一个头文件......看起来很有效。谢谢!

标签: c++ visual-studio arduino visual-studio-2015 visual-c++-2010


【解决方案1】:

我想我得到了答案。您需要手动为 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

【讨论】:

    【解决方案2】:

    这个 sn-p 在 GCC/Linux 和 MSVS 2015/Windows 下编译良好。

    问:它对你有用吗? Arduino IDE 可以吗?

    问:使用 Arduino (Visual Micro) 是否会出现“错误:'T' 没有命名类型”?您联系过视觉微吗?

    #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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-11
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2018-01-01
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多