代码之家  ›  专栏  ›  技术社区  ›  Nick

某些模板类型本身的模板函数的特殊实例

  •  1
  • Nick  · 技术社区  · 15 年前

    我在创建非模板类的成员模板函数的特殊实例时遇到问题。例如,我有一个具有模板成员函数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 回复  |  直到 15 年前
        1
  •  0
  •   avakar    15 年前

    您试图为函数模板创建部分专用化,这是非法的。什么是你 可以 do只是创建一个重载。

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

    以下编译没有错误。

    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;
    };