c++ - 未定义对模板常量和函数的引用

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

函数头:(Templated Outer Class Map has inner class Iterator)

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

为什么编译器假设插入的定义现在是 (pair const &) 而不是我的 (const pair &) 有区别吗?我这样称呼不恰当吗?我很困惑。是的,这是为了类,我们正在重新实现 map 。所以函数定义是给定的,我只需要找出如何调用它并使其工作。

最佳答案

这个函数:

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;

关于c++ - 未定义对模板常量和函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22133811/

相关文章:

c++ - 如何从 OpenCV C++ 中的图像中裁剪特定的矩形部分(ROI)

c - 使用 C 中的 std::atomic

c++ - 自动扣除部分模板类型

c++ - 使用 C++ constexpr 可以创建符号重复吗?

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 开始执行

c++ - 在 C++ 中,为什么模板函数不能有偏特化?

c++ - 使用来自 const 成员函数的每个类 boost::log::sources::logger

C++ -/tmp/cckpbRW.o :main. cc :(. 文本+0x9d):未定义引用

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?