Я реализую свою собственную карту, и это часть кода. Часть кода, которая меня беспокоит, это два объявления:
template<typename KEY, typename VAL>
Map<KEY,VAL>::MapPair<KEY,VAL> Map<KEY,VAL>::make_map_pair(KEY k, VAL v){
return MapPair<KEY,VAL>(k,v);
}
template<typename KEY, typename VAL>
template<typename K, typename V>
Map<KEY,VAL>::MapPair<K,V>& Map<KEY,VAL>::MapPair<K,V>::setKey(K keyp, V val){
key = keyp;
value = val;
}
Определение класса выглядит следующим образом:
template <typename KEY, typename VAL>
class Map{
private:
template<typename K, typename V>
class MapPair {
public:
K key;
V value;
MapPair(){};
MapPair(K key, V value);
MapPair<K,V>& setKey(K key, V val);
V& getValue();
K getKey();
bool operator==(MapPair<K,V> item);
};
List<MapPair<KEY,VAL>> pair_list_;
MapPair<KEY,VAL> make_empty_map_pair(KEY k);
MapPair<KEY,VAL> make_map_pair(KEY k, VAL v);
public:
Map(){}
bool exists(KEY key);
VAL& operator[](KEY key);
VAL pop_pair(KEY key);
};
Этот код компилируется без малейшего намека на g++, но Visual Studio 2013 выдает ошибки:
error C2059: syntax error : ')'
error C2059: syntax error : ')'
каждое из верхних определений функций генерирует ошибку.
Из g++ под debain 7.5
g++ -Wall -c -std=c++11 vm.cpp
g++ vm.o -o vm
и он работает хорошо, без проблем во время выполнения и делает то, что должен делать.
Вопрос в том, почему g++ работает нормально, а vs2013 не компилирует? Что я могу сделать, чтобы этот код правильно скомпилировался на vs2013? Какие привычки я могу выработать, чтобы обеспечить переносимость кода, который я пишу?
typename Map<KEY,VAL>::template MapPair<K,V>
- person Piotr Skotnicki   schedule 21.12.2014