gpt4 book ai didi

c++ - 模板函数作为模板类的友元

转载 作者:行者123 更新时间:2023-11-30 04:11:16 24 4
gpt4 key购买 nike

如果我有一个模板类,例如template <typename T> class Foo ,我知道可以使用相同的模板参数将模板函数声明为此类的友元。见以下代码:

#include <iostream>

template <typename T> class Foo;

template <typename U>
U bar(Foo<U>& f)
{
return f.val_;
}

template <typename T>
class Foo {
private:
T val_, imag;

public:
Foo(T val) : val_(val) {}

friend T bar<>(Foo<T>& f);
};


int main()
{
Foo<int> foo(1);
std::cout << bar(foo) << std::endl;
}

但是怎么可能使用模板类的模板参数声明一个模板参数较多的模板函数成为模板类的友元,而只有剩下的模板参数是可变的呢?

详细来说,我想要这样的东西:

template <typename T> class Foo;

template <typename U, typename V>
U bar(Foo<U>& f, V& v)
{
...
}

template <typename T>
class Foo {
private:
T val_, imag;

public:
Foo(T val) : val_(val) {}

template<typename V> friend T bar<>(Foo<T>& f, V& v);
};

如果有人能帮我解决这个问题,我会很高兴。

最佳答案

简而言之,你不能那样做,即使这似乎是一个合乎逻辑的选择。原因如下:

如果你这样声明一个 friend :template<typename V> friend T bar<>(Foo<T>& f, V& v);您实际上指的是另一个函数,而不是具有两个模板参数的函数。例如,如果您有类型 Foo<int>然后你的 friend 声明refferts到具有这个定义的函数:

template < typename V>
int bar(Foo<int>& f, V& v);

这是一个完全不同的函数:

template <typename U, typename V>
U bar(Foo<U>& f, V& v);

关于c++ - 模板函数作为模板类的友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290732/

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