2009-05-06 52 views
2

想我代表的圖像類爲:當涉及多個模板類型時,是否可以縮小類和函數之間的朋友關係?

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>&); 

圖像定義中。編譯器根本不喜歡這個(或其他變體),主要是因爲它不匹配原始函數聲明,所以私有指針不能被訪問。是否有可能在這裏得到我想要的,還是應該爲「更友好」版本解決?

回答

1

我看到這種情況出現的定義函數的圖像類裏面,像這樣的唯一方法:

#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); 
} 
3

據我所知,你不能有一個部分專門的模板功能。

你可以創建一個Convolver結構,你可以部分專門化,然後創建一個包裝來做convolve。