2014-03-02 93 views
0

函数头:(模板化外部类地图具有内部类的Iterator)未定义参考模板CONST&功能

Iterator insert(const std::pair<const T1, T2>&); 

功能实现:

template<typename T1, typename T2> 
typename Map<T1,T2>::Iterator insert(const std::pair<const T1, T2> &p) 

代码调用插入功能:

std::pair<int,char>p = std::make_pair(5, 'z'); 
mymap3.insert(p); 

使用g ++编译-g -std = C++ 11,错误:

In function `main': 
testmap.cpp:535: undefined reference to 
Map<int, char>::insert(std::pair<int const, char> const&)' 
collect2: error: ld returned 1 exit status 

为什么编译器插入承担人的定义是现在(对常量&),而不是我的(常量对&)的定义是有区别吗?我是否不恰当地称呼它?我很困惑。是的,这是上课,我们正在重新实施地图。所以函数定义是一个给定的,我只需要找出如何调用它并使其工作。

+3

'const T&'和'T const&'是一样的。你是在'.cpp'文件中定义函数吗? – juanchopanza

+0

所有这些代码都在同一个.cpp – user1449870

+1

你是否在需要的地方包含'.cpp'?实际上,只需发布​​一个简单的测试用例,可以很容易地再现问题。如果代码真的在'.cpp'中,你不会得到链接器错误。 – juanchopanza

回答

2

此功能:

template<typename T1, typename T2> 
typename Map<T1,T2>::Iterator insert(const std::pair<const T1, T2> &p) 

Map类定义之外声明的时候,是不是一个成员函数 - 它定义了一个全局insert

这是在名字空间范围中声明的Map<T1, T2>的构件(即,类定义外):

template<typename T1, typename T2> 
typename Map<T1,T2>::Iterator Map<T1,T2>::insert(const std::pair<const T1, T2> &p) 

注意,成员函数名已经由类名,在此情况下是Map<T1, T2>合格。

在一个相关的说明,使用尾随返回类型将让你摆脱一些在返回类型的污秽,因为尾随返回类型名称在类的范围内得到解决:

template<typename T1, typename T2> 
auto Map<T1, T2>::insert(const std::pair<const T1, T2> &p) -> Iterator; 
+0

是的,这是答案。现在有道理。我在所有的C++语法中迷失了方向。尽管我从来没有听说过C++中的尾随返回类型,但我必须检查一下。 – user1449870

+0

@ user1449870追溯返回类型的时代将会很短,因为C++ 14引入了返回类型的演绎,在很多情况下,一个简单的'auto'就足够了。 – TemplateRex