gpt4 book ai didi

C++将 friend 添加到模板类以进行类型转换

转载 作者:可可西里 更新时间:2023-11-01 17:57:05 26 4
gpt4 key购买 nike

我目前正在阅读“Effective C++”,有一章包含与此类似的代码:

template <typename T>
class Num {
public:
Num(int n) { ... }
};

template <typename T>
Num<T> operator*(const Num<T>& lhs, const Num<T>& rhs) { ... }

Num<int> n = 5 * Num<int>(10);

书上说这行不通(实际上行不通),因为您不能指望编译器使用隐式类型转换来专门化模板。

作为解决方案,建议使用“friend”语法在类中定义函数。

//It works
template <typename T>
class Num {
public:
Num(int n) { ... }

friend
Num operator*(const Num& lhs, const Num& rhs) { ... }
};

Num<int> n = 5 * Num<int>(10);

这本书建议在我需要隐式转换为模板类类型时使用这种友元声明。这一切似乎都说得通。

但为什么我不能得到使用通用函数而不是运算符的相同示例?

template <typename T>
class Num {
public:
Num(int n) { ... }

friend
void doFoo(const Num& lhs) { ... }
};

doFoo(5);

这次编译器提示他根本找不到任何“doFoo”。如果我在类外声明 doFoo,我会得到合理的不匹配类型错误。似乎“ friend ...”部分被忽略了。

那我的理解有问题吗?在这种情况下,函数和运算符有什么区别?

最佳答案

原因就在这里

doFoo(5);

给定一个 int 参数,编译器无法找到 foo。这相当于像这样调用您的 friend 接线员:

Num<int> n = 5 * 10;

这会“起作用”,但不是通过调用 Num 类中定义的 friend operator*,而是通过调用内置的 operator* 用于整数,然后使用 Num 的转换构造函数的隐式转换。

关于C++将 friend 添加到模板类以进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13451934/

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