未定义参考模板Const&功能

时间:2014-03-02 21:34:40

标签: c++ c++11 undefined-reference

函数头:(模板化外部类映射具有内部类迭代器)

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

为什么编译器现在定义insert(对const&amp;)而不是我对(const pair&amp;)的定义是否存在差异?我不恰当地称呼这个吗?我很迷惑。是的,这是为了上课,我们正在重新实施地图。所以函数定义是给定的,我只需要找出如何调用它并使其工作。

1 个答案:

答案 0 :(得分: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;