C++ 模板扣除指南不适用于';我好像不工作

C++ 模板扣除指南不适用于';我好像不工作,c++,templates,c++17,C++,Templates,C++17,根据“C++模板完整指南”,我编写了以下代码: #include <vector> #include <cassert> #include <string> template <typename T, typename Cont = std::vector<T>> class Stack { public: Stack() = default; Stack(T elem) :

根据“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();
}
我假设由于我提供的“模板推导指南”,具体类型是
Stack

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


如何使“模板扣除指南”与
const char*
type一起使用?

至少某些版本的MSVC需要:

template<std::size_t N>
Stack(char const(&)[N]) -> Stack<std::string>;
模板
堆栈(字符常量(&)[N])->堆栈;
看起来,在执行推断向导之前,它不会将数组“衰减”为指针


.

似乎是MSVC的错误。@xskxzr好的,看起来许多编译器还没有实现模板推导指南。我想我应该跳过这一章:至少最新的GCC和CLAN版本可以处理这些,所以你可以切换到其中的一个编译器。是的,绝对使用Clang或GCC中的一个来学习C++,尤其是模板。MSVC仍然有很多bug。STL为Windows提供了一个.@ XSKXZR,它对VC++ 2017工作原理,代码17。
template<std::size_t N>
Stack(char const(&)[N]) -> Stack<std::string>;