【发布时间】: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<std::string, std::vector<std::string>>
但是编译器(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)