1

我在创建非模板类的成员模板函数的特殊实例时遇到了麻烦。例如,我有一个带有模板成员函数 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
   }

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

4

1 回答 1

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;
};
于 2010-01-10T16:29:54.790 回答