【问题标题】:Template deduction guide doesn't seem to be working模板扣除指南似乎不起作用
【发布时间】:2018-08-09 06:41:29
【问题描述】:

按照“C++ 模板完整指南”,我编写了以下代码:

#include <vector>
#include <cassert>
#include <string>

template <typename T, typename Cont = std::vector<T>>
class Stack
{
    public:
        Stack() = default;

        Stack(T elem) :
            elems({std::move(elem)})
        { }

        auto push(T const& elem)       -> void;
        auto pop()                     -> void;
        auto top()               const -> T const&;
        auto empty()             const -> bool
        {
            return elems.empty();
        }

    private:
        Cont elems;
};

Stack(char const*) -> Stack<std::string>;

template <typename T, typename Cont>
auto Stack<T, Cont>::push(T const& elem) -> void
{
    elems.push_back(elem);
}

template <typename T, typename Cont>
auto Stack<T, Cont>::pop() -> void
{
    assert(!elems.empty());
    elems.pop_back();
}

template <typename T, typename Cont>
auto Stack<T, Cont>::top() const -> T const&
{
    assert(!elems.empty());
    return elems.back();
}

并在函数main中使用模板类Stack如下:

auto main() -> int
{
    Stack stack_string {"hello"};
    std::cout << stack_string.top().size() << std::endl;
}

我假设由于我提供的“模板推导指南”,具体类型为Stack&lt;std::string, std::vector&lt;std::string&gt;&gt;

但是编译器(Visual Studio 15 2017 with C++17)产生错误,指出Stack::top的返回类型是const char *const

如何使“模板推演指南”与const char* 类型一起使用?

【问题讨论】:

  • 似乎是一个 MSVC 错误。
  • @xskxzr 好的,看起来很多编译器还没有实现模板推导指南。我想我应该跳过这一章:(
  • 至少最新的 gcc 和 clang 版本可以处理这个问题,所以你可以切换到这些编译器之一。
  • 是的,绝对使用 Clang 或 GCC 之一来学习 C++,尤其是模板。 MSVC 仍然有很多错误。 STL 先生为 Windows 提供了really cool cutting-edge MinGW distribution
  • @xskxzr 它适用于我,包括 VS 2017 15.8.3、/std:c++17 标志(项目代码 here

标签: c++ templates c++17


【解决方案1】:

至少某些版本的 MSVC 需要:

template<std::size_t N>
Stack(char const(&)[N]) -> Stack<std::string>;

在执行推导指南之前,它似乎不会将数组“衰减”为指针。

Live example.

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 2020-02-17
    • 2020-11-30
    • 2023-01-02
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多