gpt4 book ai didi

c++ - 跳过模板参数

转载 作者:行者123 更新时间:2023-11-28 00:22:58 26 4
gpt4 key购买 nike

为什么允许我跳过模板参数(见评论)?为什么我会收到链接错误?

template <typename T>
class Number {
public:
Number(int val) {}

// Why can I skip template arguments here?
friend Number operator* (Number first, Number second);
};

template<typename T>
Number<T> operator* (Number<T> lhs, Number<T> rhs) {
return Number<T>(42);
}

int main() {
Number<int> num1(22), num2(23);
Number<int> res = num1 * num2;
}

最佳答案

  1. 只有当类模板的名称出现在该类的范围内时,才能省略类模板的模板参数。所以你的 friend声明隐式采用两个 Number<T>参数,但请注意它不是模板。

  2. 因为它不是模板,T在两个Number<T>参数实际上是int正如您在 num1 的实例化中指定的那样和 num2 .因此你的friend声明实际上是:

    friend Number operator* (Number<int> first, Number<int> second);
  3. 下面定义你的函数模板Number是一个单独的重载,而不是你声明为 friend 的重载。这是因为第一个是一个常规函数,需要两个 Number<int>而第二个是一个函数模板,可以用任何 Number<T> 实例化。实例。由于它是一个单独的重载,它不是 Number 的 friend 因此无法访问 Number 的私有(private)/ protected 成员.

  4. num1 * num2选择调用您的常规友元函数,因为两个参数完全匹配。由于尚未定义该函数,您会收到 undefined reference 。

关于c++ - 跳过模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26553375/

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