c++ - 模板推导指南似乎不起作用

标签 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) :
            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在函数中 main如下:

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

我假设由于我提供的“模板推导指南”,具体类型是 Stack<std::string, std::vector<std::string>>

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

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

最佳答案

至少某些版本的 MSVC 需要:

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

看起来它不会在执行推导指南之前将数组“衰减”为指针。

Live example .

关于c++ - 模板推导指南似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51760374/

相关文章:

c++ - C++ unix socket编程,recv返回0,但仍然接收数据,但有时接收的比发送的多

C++ 调用嵌套模板类析构函数

c++ - 为类模板实现一个类型特征,该类型特征对于实际的类模板和继承它的类都是正确的

c++ - 当我遇到错误的 constexpr if branch 时停止 visual studio 17 编译

c++ - 使用 find 搜索字符串中是否存在空格

c++ - 如何让协程始终在同一个线程中工作?

C++ - 获取派生类型作为模板参数

c++ - 从模板类继承的类的正确声明

c++ - typeid ("") != typeid(const char*)

c++ - const_iterator 和迭代器有什么区别?