- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读有关 typename
在 C++ 模板编程中的用法(例如 this Q/A )。在我看来,似乎在使用依赖嵌套类型名称 时,我们应该使用typename
来避免解析歧义。我还在 Scot Meyers 的书 effective C++ 上查过这个,项目#42。
但令我感到奇怪的是,书中的同一个示例在没有 typename
的情况下也能正常工作。这是代码:
template<class C>
void Print2nd(const C & cont)
{
if (cont.size() >= 2)
{
C::const_iterator * iter1 = new C::const_iterator(cont.begin()); // why typename is NOT needed?
C::const_iterator iter2 = cont.begin(); // why typename is NOT needed?
(*iter1)++;
iter2++;
int value1 = **iter1;
int value2 = *iter2;
std::cout << "The value of 2nd with pointer is: " << value1 << std::endl;
std::cout << "The value of 2nd without pointer is: " << value2 << std::endl;
}
}
int main()
{
std::vector<int> vect = {1,2,3,4,5,6};
Print2nd(vect);
return 0;
}
我正在使用 VS2015。那么,问题是为什么在此上下文中不需要 typename
?最近的 C++ 编译器是否有任何升级以避免在这种情况下使用 typename
?或者我在代码中犯了错误?
更新 1:感谢@FrançoisAndrieux 的评论,VS2008 和 VS2010 中似乎发生了同样的事情,如 this Q/A 中所报告的那样.
最佳答案
在c++20 typename
在那里不需要。在某些情况下,不再需要 typename
,因为从句法上讲,那里的任何内容都必须是一个类型。
特别是:
A qualified name that appears in type-id, where the smallest enclosing type-id is:
- the type in a new expression that does not parenthesize its type;
Quoted source不是直接来自标准,但非常可靠。
在 c++20 之前那里需要 typename
;它将被解析为一个值,并且 new value
不是有效语法。在 c++20 typename
在该上下文中是可选的。
现在,visual-studio-2015没有c++20其中的特点;您所看到的是 MSVC 未能正确实现 c++11/c++14/c++17 , 不是 c++20扩展名。
关于c++ - 为什么 VS2015 中模板相关的嵌套类型名称不需要 typename 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58101319/
我试图任意“绑定(bind)”模板参数,但遇到了一个优雅问题。 直接切入根本问题,gcc 6.2 有以下问题,但逻辑上我认为没有问题...... template P, typename A, typ
我想知道为什么类特化来自 template至 template不支持。 例如: template struct B{}; template struct B{}; //ok template str
我希望以下代码在 foo 从 base 派生任何东西时编译,否则会出现编译错误。我已经编写了类型特征类 is_Base,因为 std::is_base_of 不能很好地与我的模板内容一起使用。我很接近
最近我偶然发现了这样一段代码: template template void SomeClass::Function() {} 有模板函数,但它有奇怪的语法,我不太明白。它有什么作用?附近有没有t
我有一个 vector : std::vector> m_connections 然后我想声明一个由共享指针组成的 vector ,指向与该 vector 以通用方式由弱指针持有的相同类型: std:
探索时this answer我发现采用参数包的模板不会被期望具有特定数量参数的模板的模板接受。 在我看来,这是一个缺陷,因为如果一个模板可以接受任意数量的参数,它应该能够映射到一个特定的数字。有语言律
我需要为我的类获取 2 个类型参数:T1,它是一个具有模板的类,以及 T2,它是 T1 模板的参数。 在我的例子中,一个顶点类型(有 2 个,一个从另一个继承),以及顶点存储的数据类型(在我的例子中是
有时我发现自己需要以下东西: template struct choose{ typedef T1 type; }; template struct choose{ typedef T2 ty
对我来说,编译器可以推导出这样的模板类型看起来很自然: template struct wrap { std::function func_; template wrap(Ar
我对嵌套模板及其模板特化有疑问。给定以下类: 一个小模板类 template class T { public: T(){} virtual ~T (){} }; 还有一些嵌套模板 t
我正在从事一个使用 VS 2008 中内置的测试工具的项目。 我会定期看到类似于以下内容的错误:“AcademyPro.Code.BLL.Appearance”类型的值无法转换为“AcademyPro
代码如下: namespace o { template struct Alias; template inline std::ostream &operator &inst); template
根据文档(https://en.cppreference.com/w/cpp/utility/move),std::move有两种构造函数,在下面发布。 这些构造函数之间有什么区别? 最让我困惑的是,
我有三个 View (AddMatchView、TeamPickerView 和 TeamsOfCountryView)。一切都应该像这样工作:从 AddTeamView 我转到 TeamPicker
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我试图通过想象神秘的构造来更全面地掌握模板语法和语义。我认为 C++11 标准不允许使用以下语法: template class A {...}; // phony "specialization"
我非常惊讶地发现,当依赖类型作为基类出现时,没有必要添加 typename: struct B {}; struct wr { typedef B type; }; template struct A
我一直在阅读有关删除类型引用的内容,here . 它给出了以下示例: #include // std::cout #include // std::is_same template void pr
一段时间以来,我一直在尝试使用模板,但我做的越多,我意识到我理解的就越少。这个最新的问题感觉就像是我发现了一个相当根本的误解,我开始比以往任何时候都想得更多,“好吧,明天我不应该写任何代码,而是找一个
以下是代码,引用自 Addison Wesley 的 C++ 模板: template class MyClass { typename T::SubType * ptr;
我是一名优秀的程序员,十分优秀!