- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们在我们的代码库中观察到一个令人惊讶的行为,其中未能应用友元关系。 (目前仅使用 Clang,版本 3.6 编译)
我们可以将其简化为这个最小的例子。假设我们有以下模板类定义:
template <int>
class Element
{};
// Forward declaration of FriendBis
template <template <int> class> class FriendBis;
class Details
{
friend class FriendBis<Element>;
int mValue = 41;
};
template <template <int> class>
class FriendBis
{
public:
void useDetails(const Details &aDetails)
{
aDetails.mValue;
}
};
这里,Details
声明 FriendBis
的实例化,其单个模板模板参数替换为 Element
是其 friend
。因此,以下客户端代码编译成功:
FriendBis<Element> fb1;
fb1.useDetails(Details());
现在,让我们介绍额外的 trait
模板类型,其全部目的是将 proto
定义为 Element
模板的模板别名:
struct trait
{
template <int N>
using proto = Element<N>;
};
下面的客户端代码无法编译:
FriendBis<trait::proto> fb2;
fb2.useDetails(Details());
这让我们很惊讶,因为 trait::proto
是 Element
的别名,但是一个编译而另一个不编译。
FriendBis
的所有实例化为 friend )。最佳答案
别名模板与其别名的类型不是同义词:trait::proto
和 Element
是不同的类型。当模板 ID 引用 trait::proto
的特化时then 它等同于被替换的类型。简单地说,trait::proto
不是 Element
,但是 trait::proto<0>
是 Element<0>
.
回答您的问题:
是的,这是预期的行为
理由是别名类型可能远比 Element<N>
复杂得多, 它可能类似于 Element<ElementForInt<N+1>::value>
.这样映射就不明显了。
我想不出一个解决方法。如果你想检查一个模板模板参数是否与其他模板相同和考虑别名模板,你可以检查这两个名称的实例化是否具有相同的类型,例如std::is_same<T<0>, Element<0>>
,但我不确定您将如何在好友声明中实现这一点。
关于c++ - 就友元而言,为什么别名模板与别名类型模板的处理方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33480690/
在 C++ 中,我使用多态类和友元来创建一个基本的“ friend 组”。但是,当我尝试访问类人(男孩类的 friend )的私有(private)年龄函数时,我无法访问它。有什么问题吗? /* Po
当一个 lambda 函数在 C 类的友元函数 F 中声明时,该 lambda 函数是否可以访问 C私有(private)成员(member)?具体来说,标准允许吗? 最佳答案 C++11 §[exp
首先回顾以前所学的构造函数 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在定义时被自动调用 由于构造函数没有返回值不能判断执行结果,所以不能保证初始
我想要一个模板化的友元函数。但是,我不知道如何使它在没有模板化功能的情况下以相同的方式工作。这是一个示例代码 #include namespace ns{ struct Obj { frie
我目前正在创建一个实用程序类,其中将包含重载的运算符。使它们成为成员或非成员 (friend) 函数的优缺点是什么?还是根本不重要?也许对此有最佳实践? 最佳答案 我会选择“C++ 编码标准:101
template struct test { template friend struct test; }; int main() {} 这是完全有效的代码,不是吗?我问是因为 MSVC+
相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴。希望能对初学C++的朋友起到一点
类中声明的友元函数和公共(public)函数有什么区别?当我们可以将好友功能公开并具有相同的访问权限时,使用好友功能还有什么意义呢? 最佳答案 public 指类成员函数的访问级别。 成员函数可以是公
如何在所有派生类中没有 friend 的情况下访问 privateMember? class parent{...}; //a virtual class class A: public paren
我是初学者级别的面向对象编程爱好者。我遇到了以下难题: class A { }; class B { protected: friend class A; }; class C { publi
前言:这些知识点属于C++较为前期的内容,博主在今年刷笔试题的时候遇到多次,所以特地这这篇博客再复习了一下。 1.构造函数的初始化 在推导之前,关于初始化我们先达成一点共识:初始化只能一次(记住这点)
大家好, 我正在尝试为我的数学 vector 类重载加法运算符。我的(看似逻辑正确的)简化代码是: template class Vector2 { private: T m_da
我是一名优秀的程序员,十分优秀!