Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当涉及多个模板类型时,是否可以缩小类和函数之间的朋友关系?_C++_Templates_Friend - Fatal编程技术网

C++ 当涉及多个模板类型时,是否可以缩小类和函数之间的朋友关系?

C++ 当涉及多个模板类型时,是否可以缩小类和函数之间的朋友关系?,c++,templates,friend,C++,Templates,Friend,假设我将图像类表示为: template <typename Pixel> class Image { ... }; 模板类图像{…}; 我需要我自己的交换功能来防止额外的图像复制,所以我需要让它成为图像的朋友。如果我写的是内部图像: template <typename T> friend void swap(Image<T>&, Image<T>&); 模板朋友无效交换(图像和,图像和); 我得到了我想要的,但它使所有的

假设我将图像类表示为:

template <typename Pixel> class Image { ... };
模板类图像{…};
我需要我自己的交换功能来防止额外的图像复制,所以我需要让它成为图像的朋友。如果我写的是内部图像:

template <typename T> friend void swap(Image<T>&, Image<T>&);
模板朋友无效交换(图像和,图像和);
我得到了我想要的,但它使所有的交换函数成为所有图像类的朋友。因此,我可以将朋友关系缩小如下:

template <typename Pixel> class Image;
template <typename T> void swap(Image<T>&, Image<T>&);

template <typename Pixel> class Image {
   ...
   friend void swap<>(Image&, Image&);
};
模板类图像;
模板无效交换(图像和,图像和);
模板类图像{
...
朋友无效交换(图像和,图像和);
};
如中所述

现在假设我还有一个卷积函数,可以采用浮点或整数核:

template <typename Pixel, typename KernelValue>
Image<Pixel> convolve(const Image<Pixel>&, const Kernel<KernelValue>&);
模板
图像卷积(常数图像&常数核&);
卷积需要访问图像的原始内存,所以它也必须是一个朋友。但是,我想部分缩小友谊的范围,以便Convalve是所有内核值的朋友,但仅是特定像素类型的朋友,例如:

template <typename KernelValue> friend Image<Pixel> 
    convolve(const Image<Pixel>&, const Kernel<KernelValue>&);
模板好友图像
卷积(常数映像&常数核&);

在图像定义内部。编译器根本不喜欢这个(或其他变体),主要是因为它与原始函数声明不匹配,所以无法访问私有指针。有可能在这里得到我想要的吗,或者我应该满足于“更友好”的版本吗?

据我所知,您不能拥有部分专用的模板函数


您可以创建一个卷积器结构,可以对其进行部分专门化,然后创建一个包装器来进行卷积。

我看到这种情况的唯一方法是在Image类中定义函数,如下所示:

#include <iostream>
using std::cout;

template <typename Pixel>
struct image
{
    template <typename KernelValue>
    friend image<Pixel> convolve(image<Pixel> const&, image<KernelValue> const&)
    {
            cout << "foo\n";
            return image<Pixel>();
    }
};

int main()
{
    image<int> i;
    image<float> i2;

    convolve(i, i2);
}
#包括
使用std::cout;
模板
结构映像
{
模板
友元映像卷积(映像常量&,映像常量&)
{
库特