[英]How do I use Templates to make aliases with `using` (making parameterized aliases) in C++?
I'm currently reading Bjarne Stroustrup's "The C++ Programming Language" 4th Edition. 我正在阅读Bjarne Stroustrup的“The C ++ Programming Language”第4版。 In the first parts of the book, I found an usage of
using
looks like following: 在本书的第一部分,我发现的使用
using
看起来像如下:
// Error is in these 2 lines
template<typename T>
using Iterator<T> = typename T::iterator;
*see [**] for complete program and error message*
*有关完整程序和错误消息,请参阅[**] *
This is exactly what I found in the page 105. When I turned this into a complete program and tried to compile it, g++
gave me this error masseage: 这正是我在页面105中找到的。当我把它变成一个完整的程序并试图编译它时,
g++
给了我这个错误masseage:
> g++ -std=c++14 -o fnd find_all.cpp
find_all.cpp:13:15: error: expected '=' before '<' token
using Iterator<T> = typename T::iterator;
^
find_all.cpp:13:15: error: expected type-specifier before '<' token
I can't find any problem in this code, ( I'm new to C++, I can't find the problem with my little knowledge )( More confusingly I found this on Bjarne's book ) 我在这段代码中找不到任何问题,( 我是C ++的新手,我用我的小知识找不到问题 )(更混乱的是我在Bjarne的书上发现了这个)
Could someone tell me why does that code makes an error?
有人能告诉我为什么那段代码会出错?
NOTE: However If I replaced
Iterator<C>
withtypename C::iterator
(see below), It works fine, there is no error!注意:但是如果我用
typename C::iterator
替换Iterator<C>
(见下文),它工作正常,没有错误!
[**]Complete Program and Error Message: [**]完整程序和错误消息:
// Error is in these 2 lines
template<typename T>
using Iterator<T> = typename T::iterator;
// -------------------------------------------
// For the completeness I'll include my complete program here
template<typename C, typename V>
vector<Iterator<C>> find_all(C& c, V v) // find all occurrences of v in c
{
vector<Iterator<C>> res;
for (auto p = c.begin(); p!=c.end(); ++p)
if (∗p==v)
res.push_back(p);
return res;
}
void test()
{
string m {"Mary had a little lamb"};
for (auto p : find_all(m, 'a'))
if (*p == 'a')
cerr << "string bug!\n";
list<double> ld { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 1.1, 1.1 };
for (auto p : find_all(ld, 1.1))
if (*p == 1.1)
cerr << "list bug!\n";
vector<string> strv { "blue", "yellow", "red", "white", "orange", "blue" };
for (auto p : find_all(strv, "blue"))
if (*p == "blue")
cerr << "string vector bug!\n";
}
int main(void)
{
test();
return 0;
}
ERROR MESSAGE: 错误信息:
> g++ -std=c++14 -o fnd find_all.cpp
find_all.cpp:13:15: error: expected '=' before '<' token
using Iterator<T> = typename T::iterator;
^
find_all.cpp:13:15: error: expected type-specifier before '<' token
find_all.cpp:16:8: error: 'Iterator' was not declared in this scope
vector<Iterator<C>> find_all(C& c, V v)
^
find_all.cpp:16:17: error: template argument 1 is invalid
vector<Iterator<C>> find_all(C& c, V v)
^
find_all.cpp:16:17: error: template argument 2 is invalid
find_all.cpp:16:18: error: expected unqualified-id before '>' token
vector<Iterator<C>> find_all(C& c, V v)
^
find_all.cpp: In function 'void test()':
find_all.cpp:30:31: error: 'find_all' was not declared in this scope
for (auto p : find_all(m, 'a'))
^
find_all.cpp:35:32: error: 'find_all' was not declared in this scope
for (auto p : find_all(ld, 1.1))
^
find_all.cpp:40:37: error: 'find_all' was not declared in this scope
for (auto p : find_all(strv, "blue"))
First <T>
must be omitted 首先必须省略
<T>
template<typename T>
using Iterator = typename T::iterator;
When you define a class template or function template, you use: 定义类模板或函数模板时,使用:
template <typename T> struct Foo { };
template <typename T> T bar() { return T{}; }
You don't use Foo<T>
or bar<T>
when defining the templates. 定义模板时,不要使用
Foo<T>
或bar<T>
。
Similarly, when using templates to define an alias, you need to use: 同样,使用模板定义别名时,您需要使用:
template <typename T>
using Iterator = typename T::iterator;
^^ Don't include <T>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.