模板推导指南似乎无效

时间:2018-08-09 06:41:29

标签: c++ templates c++17

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

$( '#features' ).show()
.css( {'opacity': 0, 'bottom': '-100px' } )
.animate( { 'opacity': '1', 'bottom' : 0 }, 1000 );

并在函数#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; }

但是编译器(带有C ++ 17的Visual Studio 15 2017)产生错误,指出返回类型Stack<std::string, std::vector<std::string>>Stack::top

如何让const char *const类型的“模板推导指南”起作用?

1 个答案:

答案 0 :(得分:1)

至少某些版本的MSVC需要:

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

在执行推导之前,它似乎并没有将数组“衰减”为指针。

Live example