假设我们有一个矩阵模板类的实现。
我希望用std::vector
类型T
表示矩阵。
现在,我希望通过返回向量的迭代器来返回矩阵的迭代器。为此,我发现在typename
部分中需要使用关键字public
:
typedef typename std::vector<T>::iterator iterator.
首先,我不明白为什么这里需要typename
。
其次,每个人都可以看到我使用std::vector
来表示矩阵。
我该怎么做才能防止这些信息曝光。
如何在不暴露矩阵表示的情况下实现这一目标?
答案 0 :(得分:0)
首先,我不明白为什么这里包含了typename。
typename
告诉编译器iterator
确实是一个类型,而不是一个成员,例如,它看起来完全一样。在处理模板时,您需要对此进行限定,因为此时编译器通常没有足够的信息来区分模板。
其次,每个人都可以看到我使用向量来表示矩阵,我该怎么做才能防止信息暴露。
虽然每个人都可以看到您使用的是矢量,但这不是商业机密。你提供了一个外部世界使用的typedef,强调一个向量只是一个实现细节,如果他们不这样做,他们应该得到任何东西,在我看来。
为了强调这一点,vector<T>::iterator
也是一个typedef,在一些编译器中,当你使用不同的标志进行编译时,它意味着不同的东西。有时你可以查找并在任何地方使用T*
,但是当代码最终破坏时,你真的会抱怨标准库的开发者吗?
我认为你不能更好地隐藏它:编译器需要知道迭代器是什么。
答案 1 :(得分:0)
首先,您需要使用类型名称,因为您使用的是依赖类型。有关详细信息,请参阅:Where and why do I have to put the “template” and “typename” keywords?
对于第二部分,您可以执行两个typedef。
中的一个在私人部分typedef typename std::vector<T> container;
然后在公共部分你可以做
typedef typename container::iterator iterator;
你可以看到它如何编译here
答案 2 :(得分:0)
您需要在此处加入typename
,因为存在推断类型T
。已经询问并回答here。
对于你的第二个问题,你并没有真正揭露这里的班级代表;您的班级用户不 了解基础Matrix表示是std::vector
以便使用您的班级。实际上,只有当用户努力寻找它时(例如,通过编译错误),该信息才可用。即使您定义了自己的迭代器,用户仍然可以查看源代码。
最后,如果您使用的是C ++ 11,更好的方法是使用别名:
using iterator = typename std::vector<T>::iterator;
在这种情况下没有直接优势,但很好地养成这种习惯。