template <typename T> class Foo;
template <typename T> int g(Foo<T> const&);
template <typename T> class Foo
{
public:
template <typename U> int f(Foo<U> const& p) const { return p.m; }
// which friend declaration will allow the above function to compile? The
// next one doesn't work.
template <typename U> friend void Foo<U>::template f<T>(Foo<T> const&) const;
// while this one work for g().
friend int g<T>(Foo<T> const&);
private:
int m;
};
template <typename T> int g(Foo<T> const& p) { return p.m; }
// Let's call them
void bar()
{
Foo<int> fi;
Foo<double> fd;
fd.f(fi);
g(fi);
}
以上不能用g ++和Como编译。 g()在这里显示我想用f()做什么。
例如,这里是g ++消息:
foo.cpp:11: error: invalid use of template-id ‘f<T>’ in declaration of primary template
foo.cpp: In member function ‘int Foo<T>::f(const Foo<U>&) const [with U = int, T = double]’:
foo.cpp:27: instantiated from here
foo.cpp:17: error: ‘int Foo<int>::m’ is private
foo.cpp:7: error: within this context
和como的一个:
"ComeauTest.c", line 11: error: an explicit template argument list is not allowed on
this declaration
template <typename U> friend void Foo<U>::template f<T>(Foo<T> const&) const;
^
"ComeauTest.c", line 7: error: member "Foo<T>::m [with T=int]" (declared at line 17)
is inaccessible
template <typename U> int f(Foo<U> const& p) const { return p.m; }
^
detected during instantiation of "int Foo<T>::f(const Foo<U> &)
const [with T=double, U=int]" at line 27
2 errors detected in the compilation of "ComeauTest.c".
错误消息建议的变体也没有。
顺便说一句,我知道围绕的明显工作template <typename U> friend class Foo<U>;
编辑:
14.5.4 / 5(n3225,C ++ 98的14.5.3 / 6类似,但下面的文字在n3225中更清楚)从
开始类模板的成员可以被声明为非模板类的朋友......
这可能意味着类模板的成员可能不会被声明为模板类的朋友,但我的第一个解释是这句话是对以下解释的介绍(主要是它们适用于任何专业化,明确与否,给定原型是正确的。)
答案 0 :(得分:0)
我认为你必须在朋友声明之前说template <>
,所以它知道你是专业化的朋友。
编辑:我的代码没有任何错误,即使进行实例化并调用g
也是如此。您是否可以发布导致错误的最小实际代码集以及错误消息?
答案 1 :(得分:0)
虽然我不是100%确定这是严格的标准符合, 以下代码可以通过ideone(gcc-4.3.4)和Comeau online编译:
template< class >
class Foo {
int m;
public:
template< class U > int f( Foo<U> const& p ) const { return p.m; }
template< class U > template< class V >
friend int Foo<U>::f( Foo<V> const& ) const;
};
void bar() {
Foo<int> fi;
Foo<double> fd;
fd.f( fi );
}
希望这有帮助。