在.cpp文件中声明模板类的友元函数(对于std::ostream& operator〈〈)**的正确方法是什么?
我当前的实现不起作用:
// MyTest.h
template<class T, unsigned int TSIZE> class MyTest
{
inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs);
};
// MyTest.cpp
template<class T, unsigned int TSIZE> inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs)
{
// IMPLEMENTATION
}
2条答案
按热度按时间gojuced71#
要像您一样引用
operator<< <T, TSIZE>
,这是一个模板专门化,主模板的声明必须可见,而operator<<
需要MyTest
的声明,因为它作为一个参数出现。你的定义应该与那些声明相匹配。注意,因为
operator<<
是一个模板,它的定义应该在头中。在编写所有这些抢占式声明时,另一种需要较少工作量的方法是
MyTest<T, TSIZE>
将整个模板声明为友元,而不仅仅是使用MyTest<T, TSIZE>
的专门化。您拥有的定义也应该匹配这样的声明(模板参数的名称与匹配的声明和定义无关)。
为了完整起见,我会提到,当涉及到类模板的友元时,另一种选择是在类模板定义中定义它,这定义了一个非模板友元函数,该函数对于每个专门化都是唯一的。
不可能引用这样的函数(例如
&ns::operator<<
不起作用,不像其他选项),它们只能通过ADL找到。eni9jsuy2#
我不太清楚最初的帖子想要什么,我假设它想要的是:
现在需要将这个模板函数声明为类的友元,因为这个函数需要访问
My test
的保护对象,这可以通过下面的定义来实现:在
friend
声明之前需要模板头,因为这是一个不相关的模板函数,不属于当前模板类。