我在创建非模板类的成员模板函数的特殊实例时遇到了麻烦。例如,我有一个带有模板成员函数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
}
有没有办法按照我要去的方式编写代码,或者这是不可能的?
答案 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;
};