C++某些类型的模板函数的特殊实例,该类型本身就是模板类
我在创建非模板类的成员模板函数的特殊实例时遇到了麻烦。例如,我有一个带有模板成员函数 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您试图为函数模板创建部分特化,这是非法的。您可以做的就是简单地创建一个过载。
要创建朋友,您只需使用正确的语法即可。
以下编译无错误。
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.