2015-09-06 48 views
0

假设我们有一个矩阵模板类的实现。 我希望用类型的std::vector来表示矩阵。模板类和信息隐藏的迭代器

现在,我希望通过返回矢量的迭代器来返回矩阵的迭代器。对于这一点,我看到使用关键字typenamepublic部分是必需的:

typedef typename std::vector<T>::iterator iterator. 

首先,为什么这里需要typename我不明白。

其次,大家可以看到我用std::vector来表示矩阵。 我能做些什么来防止信息暴露。

如何在不暴露矩阵表示的情况下实现此目标?

+0

对于你的第一个问题:http://stackoverflow.com/questions/7923369/when-is-the-typename-keyword-necessary – Mat

回答

0

首先,我不明白为什么typename包含在这里。

typename告诉编译器iterator确实是一个类型,而不是一个成员,例如,这看起来完全一样。您在处理模板时需要对此进行限定,因为一般情况下,编译器没有足够的信息来说明差异。

其次,每个人都可以看到我使用矢量来表示矩阵,我该怎么做才能防止信息暴露。

尽管每个人都可以看到您正在使用矢量,但这不是商业秘密。你提供了一个供外界使用的typedef,强调vector只是一个实现细节,如果他们不这样做,我认为他们应该得到一切。

为了强调这一点,vector<T>::iterator也是一个typedef,在一些编译器中,当你用不同的标志编译时,它意味着不同的事情。有时你可以查找并在任何地方使用T*,但是当代码最终破裂时,你真的会对标准库的开发者抱怨吗?

我不认为你可以更好地隐藏它:编译器需要知道迭代器是什么。

0

您需要包括typename这里,因为有是推断类型,T,存在。这已被问及回答here

对于第二个问题,你并没有在这里暴露类的表示;您的班级的用户不需要需要了解为了使用您的班级,基础Matrix表示是std::vector。这些信息实际上只有在用户努力寻找它时才可用(例如,通过编译错误)。即使你定义了你自己的迭代器,用户仍然可以看看你的源代码。

最后,如果你使用的是C++ 11,做同样的事情的一个更好的办法是使用别名:

using iterator = typename std::vector<T>::iterator; 

没有直接的优势,在这种情况下,但良好的进入这个习惯。