我有一个带有模板模板参数的类模板,我想将此参数(即其所有特化)声明为friend
。但是我找不到正确的语法。
template <template <class> class T>
struct Foo {
template <class U>
friend T; // "C++ requires a type specifier for all declarations"
template <class U>
friend struct T; // "declaration of 'T' shadows template parameter"
template <class U>
friend struct T<U>; // "cannot specialize a template template parameter"
pretty<please>
lets(be) friends T; // Compiler shook its standard output in pity
};
如何将模板模板参数声明为friend
?
template<class> friend class T;
,而Clang和EDG则会拒绝(MSVC并不会直接拒绝,但似乎也不会对其进行任何有用的操作)。 - bogdantemplate <class U, template<class> class T> struct Foo { friend T<U>; };
(翻译者注:该代码片段为 C++ 代码,意思是定义一个名为Foo
的数据结构,其中包含一个友元函数模板,该函数模板接受一个类型参数U
和一个模板参数T
,并将T
应用于U
。) - Michael NastenkoT<U>
是一个偏特化,尽管它是无效的,因为它没有比主模板更加特化)。我期望正确的形式要么是你示例中的第一个,要么就像CWG585提案的解决方案那样简单明了,即friend T;
,以保持与非模板模板参数的一致性。看起来严格标准术语来说现在有些混乱。 - bogdanpretty<please> lets(be) friends T;
的语法以供标准批准。 - sp2danny