【问题标题】:C++ Arduino 1.6 on Visual Studio 2013Visual Studio 2013 上的 C++ Arduino 1.6
【发布时间】:2016-11-05 23:17:39
【问题描述】:

我正在研究 Arduino,并想制作一架小型玩具钢琴。为了练习,我创建了自己的名为 map 的类。

#ifndef Map_h
#define Map_h

#include "Arduino.h"
template <class Key, class Value> class Map
{
public:
    Map();
    ~Map();
    void add(Key key, Value value);
    Value find(Key key);
private:
    Key *keys;
    Value *values;
    int size;
    bool resize();
};

#endif

在 main 我只是正常调用它:

Map<char, int> *name_to_freq = new Map<char, int>();
name_to_freq->add('c', 262);

但是我在编译时遇到了一些错误。

ccQwtG4w.ltrans0.ltrans.o*: In function main
ccQwtG4w.ltrans0.o*: (.text.startup+0x354): undefined reference to Map<char, int>::Map()
ccQwtG4w.ltrans0.o*: (.text.startup+0x3de): undefined reference to Map<char, int>::add(char, int)

.cpp 文件中的定义:

有没有人见过这个并且知道如何解决它?

template <typename Key, typename Value>
Map<Key, Value>::Map()
{
    keys = new Key[defaultArraySize];
    values = new Value[defaultArraySize];
    size = defaultArraySize;
}

template <typename Key, typename Value>
void Map< Key,  Value>::add(Key key, Value value)
{
    for (int i = 0; i < size; i++)
    {
        if (!keys[i]) 
        {
            keys[i] = key;
            values[i] = value; 
            if (i >= size/2)
            {
                while (!resize());
            }
        }
    }

}

【问题讨论】:

  • 你的 Map() 和 add() 的定义在哪里?
  • 一秒....添加
  • 定义是否在源文件(cpp文件)上?
  • 是的。 Visual Studio 为我自动生成 .h 和 .cpp 文件。

标签: arduino embedded


【解决方案1】:

你应该把你的模板定义放到头文件中。

在模板类中工作时,当您实例化它时,编译器将使用您提供给它的模板参数创建一个类,以便编译器应该访问您的函数的定义,但它无法访问它们,因为它们在源文件中。

方式一:

template <class Key, class Value> class Map
{
public:
    Map();
    ~Map();
    void add(Key key, Value value);
    Value find(Key key);
private:
    Key *keys;
    Value *values;
    int size;
    bool resize();
};

template <typename Key, typename Value>
Map<Key, Value>::Map()
{
    keys = new Key[defaultArraySize];
    values = new Value[defaultArraySize];
    size = defaultArraySize;
}

template <typename Key, typename Value>
void Map< Key,  Value>::add(Key key, Value value)
{
    for (int i = 0; i < size; i++)
    {
        if (!keys[i]) 
        {
            keys[i] = key;
            values[i] = value; 
            if (i >= size/2)
            {
                while (!resize());
            }
        }
    }

}

也可以直接在类中定义(方式2

template <class Key, class Value> class Map
{
public:
    Map()
    {
    }
    ~Map();
    void add(Key key, Value value)
    {
    }
    Value find(Key key)
    {
    }
private:
    Key *keys;
    Value *values;
    int size;
    bool resize();
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多