Tag: typename

何时需要“typename”关键字?

可能重复: 官方,什么是typename? 我在哪里以及为什么必须放置模板和types名关键字? 考虑下面的代码: template<class K> class C { struct P {}; vector<P> vec; void f(); }; template<class K> void C<K>::f() { typename vector<P>::iterator p = vec.begin(); } 为什么在这个例子中需要“typename”关键字? 还有其他的情况下,必须指定“typename”吗?

为什么我需要在g ++中使用typedef typename而不是VS?

自从海湾合作委员会抓到了这件事以来已经有一段时间了,但今天才发生。 但我从来没有理解为什么GCC需要在模板内使用typedef typename,而VS和我想ICC不这样做。 typedef typename是一个“错误”还是一个过于严格的标准,还是一些编译器的作者? 对于那些不知道我的意思的人来说是一个例子: template<typename KEY, typename VALUE> bool find(const std::map<KEY,VALUE>& container, const KEY& key) { std::map<KEY,VALUE>::const_iterator iter = container.find(key); return iter!=container.end(); } 上面的代码编译在VS(可能在ICC中),但在GCC失败,因为它需要这样的: template<typename KEY, typename VALUE> bool find(const std::map<KEY,VALUE>& container, const KEY& key) { typedef typename std::map<KEY,VALUE>::const_iterator iterator; //typedef typename iterator iter = container.find(key); return iter!=container.end(); } 注:这不是我正在使用的实际function,但只是愚蠢的东西,说明问题。

C ++获取模板中的types名称

我正在写一些模板类来parsing一些文本数据文件,就像这样,绝大多数parsing错误是由于数据文件中的错误造成的,而这些错误大部分都不是程序员写的,所以需要一个很好的消息,为什么应用程序未能加载,如: parsingexample.txt时出错。 [MySectiom]键的值(“notaninteger”)不是有效的int 我可以从传递给模板函数和类成员variables的参数中创build文件,节和键名称,但是我不知道如何获取模板函数试图转换的types的名称。 我目前的代码看起来像专门为简单的string和这样的: template<typename T> T GetValue(const std::wstring &section, const std::wstring &key) { std::map<std::wstring, std::wstring>::iterator it = map[section].find(key); if(it == map[section].end()) throw ItemDoesNotExist(file, section, key) else { try{return boost::lexical_cast<T>(it->second);} //needs to get the name from T somehow catch(…)throw ParseError(file, section, key, it->second, TypeName(T)); } } 而不必为数据文件可能使用的每种types制定特定的重载,因为它们有负载… 此外,我需要一个解决scheme,不会产生任何运行时间的开销,除非发生exception,即完全编译时解决scheme是我想要的,因为这个代码被称为吨的时间和加载时间已经有点长。 编辑:好吧,这是我想出的解决scheme: 我有一个types.h包含以下内容 #pragma once template<typename T> […]

何处以及为什么必须放置“模板”和“types名称”关键字?

在模板中,为什么我必须将typename名称和template放在相关名称上? 究竟什么是依赖名称呢? 我有以下代码: template <typename T, typename Tail> // Tail will be a UnionNode too. struct UnionNode : public Tail { // … template<typename U> struct inUnion { // Q: where to add typename/template here? typedef Tail::inUnion<U> dummy; }; template< > struct inUnion<T> { }; }; template <typename T> // For the last node Tn. […]