【发布时间】:2014-12-21 19:23:57
【问题描述】:
我正在实现自己的地图,这是一段代码。困扰我的部分代码是这两个声明:
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;
}
类def如下:
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 : ')'
每个顶级函数定义都会产生一个错误。
来自 debain 7.5 下的 g++
g++ -Wall -c -std=c++11 vm.cpp
g++ vm.o -o vm
而且它运行良好,没有运行时问题,并且可以做它应该做的事情。
问题是为什么g++运行得这么好,而vs2013却编译不出来?我该怎么做才能使这段代码在 vs2013 上正确编译?我可以培养什么样的习惯来确保我编写的代码的可移植性?
【问题讨论】:
-
函数的返回类型应该声明为
typename Map<KEY,VAL>::template MapPair<K,V> -
使用什么确切版本的 g++ 来编译这段代码?
-
这和stackoverflow.com/questions/18344580/… 是同一个问题.. 还没有最终答案
标签: c++ templates visual-studio-2013 g++ nested-class