【问题标题】:How do I use Templates to make aliases with `using` (making parameterized aliases) in C++?如何使用模板在 C++ 中使用 `using`(制作参数化别名)制作别名?
【发布时间】:2016-06-28 07:22:46
【问题描述】:

我目前正在阅读 Bjarne Stroustrup 的“The C++ Programming Language”第 4 版。在本书的第一部分,我发现using 的用法如下所示:

// Error is in these 2 lines
template<typename T>
using Iterator<T> = typename T::iterator;

*完整的程序和错误信息参见[**]*

这正是我在第 105 页找到的。当我把它变成一个完整的程序并尝试编译它时,g++ 给了我这个错误消息:

> 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

我在这段代码中找不到任何问题,(我是 C++ 新手,凭我的小知识我找不到问题)(更令人困惑的是,我在 Bjarne 的书中找到了这个)

有人能告诉我为什么该代码会出错吗?

注意:但是,如果我将 Iterator&lt;C&gt; 替换为 typename C::iterator(见下文),它工作正常,没有错误!

[**]完整的程序和错误信息:

// 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;
}

错误信息:

> 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"))

【问题讨论】:

    标签: c++ templates c++11 c++14 using


    【解决方案1】:

    第一个&lt;T&gt; 必须省略

    template<typename T>
    using Iterator = typename T::iterator;
    

    【讨论】:

    • 非常感谢,现在可以正常使用了。好像是书上的错别字,谢谢
    【解决方案2】:

    当你定义一个类模板或函数模板时,你使用:

    template <typename T> struct Foo { };
    
    template <typename T> T bar() { return T{}; }
    

    在定义模板时不要使用Foo&lt;T&gt;bar&lt;T&gt;

    同样,使用模板定义别名时,需要使用:

    template <typename T>
    using Iterator = typename T::iterator;
                 ^^ Don't include <T>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 2016-06-25
      • 2016-11-18
      • 2017-07-22
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      相关资源
      最近更新 更多