C ++特殊的模板函数实例,适用于某些类型,它本身就是一个模板类

时间:2010-01-10 16:18:52

标签: c++ templates instance friend

我在创建非模板类的成员模板函数的特殊实例时遇到了麻烦。例如,我有一个带有模板成员函数F的类A:

class A
   {public:
      template <class T> int F (T arg) const;
      ....
   }

并希望为类型B设置此模板函数F的特殊实例:

class B;
...
template <> void A::F (B arg) const //GOOD!

它完美无缺,直到看到B本身就是模板!

此代码

template <class T> class B ...
...
template <> void A::F (B<T> arg) const //error, T undeclared

以及

template <class T> class B ...
...
template <class T> template <> void A::F (B<T> arg) const //error, too many templates

给出了编译错误。

第二个问题是,如何将此特殊实例(或整个模板实例)声明为B类的友元函数? (即使B不是模板,也不起作用。)

class B
   {friend template <> void A::F (B arg) const // error
     // as well as
    template <> friend void A::F (B arg) const // error
   }

有没有办法按照我要去的方式编写代码,或者这是不可能的?

1 个答案:

答案 0 :(得分:0)

您正在尝试为函数模板创建部分特化,这是非法的。你可以做的只是创造一个过载。

要创建朋友,您只需使用正确的语法。

以下编译没有错误。

template <typename T>
struct B {};

struct A
{
    template <typename T>
    void F(T arg) const;

    template <typename T>
    void F(B<T> arg) const;

    template <typename T>
    friend void G(B<T> arg);

    template <typename T>
    friend struct B;
};