2013-11-20 226 views
0

如果我有朋友模板函数

namespace A 
{ 
     template<class T> 
     inline void SomeFunc(T& archive, Object* object) 
     { 
      // ... 
     } 
} 

和非模板类

namespace B 
{ 
    class Manager 
    { 
     // ... 
     template <typename T, typename U> friend void A::SomeFunc(T& t, U* u); 
    }; 
} 

为什么不类Manager承认A::SomeFunc()为好友?

我想要做的事:我要去有相当数量的这些SomeFunc S的,都采取了不同U类(从相同的基本推导),所以我一直在寻找一个干净的方式这样做不会使这些功能变得很重要。

+0

因为他们是不一样的功能?注意不同数量的模板参数 – Praetorian

回答

2

模板参数的数量很重要。你是一个模板,需要两个模板参数,但真正的模板只有一个。他们是不同的实体。

朋友的声明应该是:

template<class T> 
friend void SomeFunc(T&, Object*); 
+0

有道理。事情是,我会有很多这些'SomeFunc's,都采取不同的'U'类(来自同一个基地),所以我正在寻找一个干净的方式来做到这一点。直到现在,我还没有解决方案。 –

+0

@ KristianD'Amato:对友谊的需求是罕见的。需要结交许多不同的功能更为罕见。也许你可以看看你的设计并重构它。 –

+0

是的,你说得对。我保护构造函数来控制对象创建,但我想这将保持幻想。 –