【发布时间】:2021-09-11 18:04:18
【问题描述】:
这是经典的“密码”模式,它允许函数只能在特定类的范围内访问:
#include <iostream>
template <typename T>
class passkey {
private:
friend T;
passkey() {}
// noncopyable
passkey(const passkey&) = delete;
passkey& operator=(const passkey&) = delete;
};
struct A {
A();
};
void g(int i, passkey<A>) {
std::cout << i;
}
A::A(){g(42,{});}
int main() {
A a;
return 0;
}
这里的函数g只能在A内调用。但是如果A 现在是一个模板类,是否可以扩展它?下面的 sn-p 不能编译(用clang,但它用gcc...),因为对于模板朋友来说,似乎必须使用一个详细说明符,这似乎导致声明冲突...
#include <iostream>
template <template<typename...> class T>
class passkey {
private:
template<typename...> friend class T;
passkey() {}
// noncopyable
passkey(const passkey&) = delete;
passkey& operator=(const passkey&) = delete;
};
template<typename T>
struct A {
A();
};
void g(int i, passkey<A>) {
std::cout << i;
}
template<typename T>
A<T>::A(){g(42,{});}
int main() {
A<void> a;
return 0;
}
这给出了铿锵声:
>source>:6:38: error: declaration of 'T' shadows template parameter
template<typename...> friend class T;
^
<source>:3:39: note: template parameter is declared here
template <template<typename...> class T>
有什么诀窍可以让它发挥作用吗?
【问题讨论】:
标签: c++ templates variadic-templates friend