首页 > 解决方案 > 模板扣除指南似乎不起作用

问题描述

在“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>>

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

如何使“模板推导指南”适用于const char*类型?

标签: c++templatesc++17

解决方案


至少某些版本的 MSVC 需要:

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

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

活生生的例子


推荐阅读