Visual Studio 2013上的C++ Arduino 1.6
问题描述:
我正在研究Arduino,并且想要制作一个小型玩具钢琴。为了练习,我创建了我自己的叫做map的类。Visual Studio 2013上的C++ Arduino 1.6
#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
在主我只是把它正常:
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());
}
}
}
}
答
你应该把你的模板定义放到头文件中。
当在模板类中工作时,当您实例化它时,编译器将创建一个包含您提供给它的模板参数的类,以便编译器访问您的函数的定义,但不能访问它们,因为他们在源文件中。
方法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();
};
+0
非常感谢。我解决它的方式1。 –
哪里是你的地图(定义),并添加() ? –
一秒钟....添加 –
是定义在源文件(cpp文件)上? –