gpt4 book ai didi

c++ - 用户定义类的交换函数从未实例化?

转载 作者:行者123 更新时间:2023-11-30 01:11:50 25 4
gpt4 key购买 nike

以下是我在创建一个更大的类时遇到的一些简化示例,并试图通过提供我自己的非成员 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com