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()); 
      } 
     } 
    } 

} 
+0

哪里是你的地图(定义),并添加() ? –

+0

一秒钟....添加 –

+0

是定义在源文件(cpp文件)上? –

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

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

方法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。 –