- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
是否有一种语法可以只对模板类的某些特化进行友化,或者你是否必须将所有的特化与诸如:
template<class FooType> friend class Bar;
如果它存在,我会寻找类似的东西:
template<class FooType> friend class Bar<FooType const>;
特化似乎有自己的“友好”身份,因为默认情况下它们不是彼此的 friend 。例如,getFoo()
这里不能被从 const 特化派生的非常量情况调用,因为它是私有(private)的:
template<class FooType> class Bar;
template<class FooType>
class Bar<FooType const> {
public:
Bar (std::string name) : _foo (name) { }
FooType const * operator->() const
{ return &getFoo(); }
private:
FooType const & getFoo() const
{ return _foo; }
private:
FooType _foo;
};
template<class FooType>
class Bar : public Bar<FooType const> {
public:
Bar (std::string name) : Bar<FooType const> (name) { }
FooType * operator->()
{ return &getFoo(); }
private:
FooType & getFoo()
{ return const_cast<FooType &>(Bar<FooType const>::getFoo()); }
};
您必须添加 template<class FooType> friend Bar;
到 const 特化。
(顺便说一句,friend 的标签描述有点滑稽。)
最佳答案
你在找
friend Bar<FooType const>;
这是两种方式之一,friend
可以声明。第一个语法将类声明为友元:
friend Type;
哪里Type
可以是简单类型 Bar
(这不是模板),也可以是类模板的特定实例,例如 Baz<int>
. int
当然,也可以是封闭类模板中的模板参数或您喜欢的任何内容。重点是:它是一个被赋予 friend 状态的单一类型。
第二种语法将类模板声明为友元:
template< ... > friend class ClassTemplate;
哪里...
是ClassTemplate
的模板参数声明.如您所见,您只需指定模板参数列表,但该列表并未在任何地方使用。不可能将这两种语法结合起来,没有办法“部分友化”类模板或使用 SFINAE/enable_if
启用或禁用某些好友声明。事实上,将名称添加到模板参数甚至没有多大意义,在你的上面我只是写
template< class > friend class Bar;
添加FooType
在这里并没有真正增加任何有值(value)的东西。
关于c++ - 如何与特定模板特化成为 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546949/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!