2016-11-05 2 views
0

Я работаю над Arduino и хочу создать маленькое игрушечное пианино. Для практики я создаю свой собственный класс, называемый map.C++ Arduino 1.6 на Visual Studio 2013

#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

Вы должны поместить определение шаблона в файл заголовка.

При работе в классе шаблонов при создании экземпляра компилятор создаст класс с аргументом шаблона, который вы ему подали, чтобы компилятор мог получить доступ к определениям ваших функций, но он не может получить к ним доступ, они находятся в исходном файле.

Способ 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()); 
      } 
     } 
    } 

} 

или вы можете непосредственно определить их в классе (Way 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. –