想我代表的圖像類爲:當涉及多個模板類型時,是否可以縮小類和函數之間的朋友關係?
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&);
};
如C++ FAQ-lite 35.16中所述。
現在假設我也有,可以採取浮點或積分核卷積功能:
template <typename Pixel, typename KernelValue>
Image<Pixel> convolve(const Image<Pixel>&, const Kernel<KernelValue>&);
卷積需要訪問圖片的原始內存,因此它也必須是一個朋友。不過,我想局部變窄的友誼,使卷積是朋友對所有KernelValues但只有特定的像素類型,是這樣的:
template <typename KernelValue> friend Image<Pixel>
convolve(const Image<Pixel>&, const Kernel<KernelValue>&);
圖像定義中。編譯器根本不喜歡這個(或其他變體),主要是因爲它不匹配原始函數聲明,所以私有指針不能被訪問。是否有可能在這裏得到我想要的,還是應該爲「更友好」版本解決?