作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下是我在创建一个更大的类时遇到的一些简化示例,并试图通过提供我自己的非成员 friend 交换功能来实现可交换。
#include <iostream>
#include <utility>
template<typename T>
class Wrapper {
friend void swap(Wrapper& a, Wrapper& b);
public:
Wrapper(T t) : value_(t) {}
const T& operator*() const { return value_; }
private:
T value_;
};
template<typename T>
void swap(Wrapper<T>& a, Wrapper<T>& b) {
using std::swap;
swap(a.value_, b.value_);
}
int main() {
Wrapper<int> w1{5}, w2{10};
std::cout << *w1 << " " << *w2 << std::endl;
swap(w1, w2);
std::cout << *w1 << " " << *w2 << std::endl;
}
尝试编译此小型测试程序会导致 clang 出现以下链接器错误(Apple LLVM 版本 7.0.2,OS X El Capitan 10.11.3 上的 clang-700.1.81):
[~/Development/c++_test][16:30:57]$ clang++ --std=c++11 -o SwapTest SwapTest.cc
Undefined symbols for architecture x86_64:
"swap(Wrapper<int>&, Wrapper<int>&)", referenced from:
_main in SwapTest-a978ea.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
尽管我在 main() 中使用了我定义的 Wrapper 类的模板交换函数,但为什么它没有正确实例化?
最佳答案
friend void swap(Wrapper& a, Wrapper& b);
声明一个非模板函数swap
恰好需要 Wrapper<T>&
争论。这与您的模板函数不匹配 swap<T>
.
一个简单的修复方法是将友元声明为模板函数。
template <typename U>
friend void swap(Wrapper<U>&a, Wrapper<U>& b);
缺点是你交的 friend 比你想要的多一点:每swap
实例化是每个Wrapper<T>
的 friend ,不只是正确的 Wrapper<T>
类。
更正确的方法是在类之前声明模板函数:
template <class T> class Wrapper;
template <class T>
void swap(Wrapper<T>&, Wrapper<T>&);
template <class T>
class Wrapper
{
friend void swap<>(Wrapper&, Wrapper&);
// ...
关于c++ - 用户定义类的交换函数从未实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235903/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!