C++某些类型的模板函数的特殊实例,该类型本身就是模板类

发布于 2024-08-17 05:29:00 字数 965 浏览 5 评论 0原文

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

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

I got trouble in creating special instance of member template function of non-template class. I have, for example, class A with template member function F:

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

and want to have a special instance of this template function F for type B:

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

and it works perfectly, until appears that B is a template itself!

This code

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

as well as

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

gives compiling error.

The second trouble is, how to declare this special instance (or template instance at whole) to be friend function of class B? (Is does not work even if B is not a template).

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

Is there a way to write code in a way I'm going to at all or it is not possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绝不服输 2024-08-24 05:29:00

您试图为函数模板创建部分特化,这是非法的。您可以做的就是简单地创建一个过载。

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

以下编译无错误。

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

You're attempting to create a partial specialization for a function template, which is illegal. What you can do is simply create an overload.

To create a friend, you merely have to use the correct syntax.

The following compiles without errors.

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;
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文