我有一个简单的程序,试图用来测试C ++ 17的类模板参数推导。
#include <iostream>
#include <list>
int main(int argc, const char * argv[]) {
const char* a = "Hello";
std::list x(1, a);
return 0;
}
我想std :: list推断类型为const char*
的列表。但是,当尝试运行此代码时,出现错误No viable constructor or deduction guide for deduction of template arguments of 'list'
。具体而言,应与此list(size_type __n, const value_type& __x);
相匹配的构造函数报告错误,提示:
Candidate template ignored: substitution failure [with _Tp = const char *, _Alloc = std::__1::allocator<const char *>]: 'size_type' is a protected member of 'std::__1::__list_imp<const char *, std::__1::allocator<const char *> >'
我很好奇为什么这行不通,但是像这样的程序完全可以用std::pair
构成,并且可以轻松推论出参数:
#include <iostream>
#include <list>
int main(int argc, const char * argv[]) {
const char* a = "Hello";
std::pair x(1, a);
return 0;
}
谢谢。
答案 0 :(得分:1)
clang 5和6以及gcc 7和8可以毫无问题地编译您的代码。因此,您正在使用的编译器未正确实施推论指南,或者使用的库没有针对std::list