我试图让这个小例子工作
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<char> v{'a', 'b', 'c', 'd'};
std::transform(v.begin(), v.end(), v.begin(), std::toupper);
std::for_each(v.begin(), v.end(), [](char & c) {
std::cout << c << " ";
});
}
我认为很明显,我想要实现什么。但是,我收到这些错误
||=== Build file: "no target" in "no project" (compiler: unknown) ===|
C:Usersvitaly.bushaevDocumentsvk cup1.cpp||In function 'int main()':|
C:Usersvitaly.bushaevDocumentsvk cup1.cpp|8|error: no matching function for call to 'transform(std::vector<char>::iterator, std::vector<char>::iterator, std::vector<char>::iterator, <unresolved overloaded function type>)'|
C:Usersvitaly.bushaevDocumentsvk cup1.cpp|8|note: candidates are:|
C:Program Files (x86)CodeBlocksMinGWlibgccmingw324.9.2includec++bitsstl_algo.h|4152|note: template<class _IIter, class _OIter, class _UnaryOperation> _OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation)|
C:Program Files (x86)CodeBlocksMinGWlibgccmingw324.9.2includec++bitsstl_algo.h|4152|note: template argument deduction/substitution failed:|
C:Usersvitaly.bushaevDocumentsvk cup1.cpp|8|note: couldn't deduce template parameter '_UnaryOperation'|
C:Program Files (x86)CodeBlocksMinGWlibgccmingw324.9.2includec++bitsstl_algo.h|4189|note: template<class _IIter1, class _IIter2, class _OIter, class _BinaryOperation> _OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation)|
C:Program Files (x86)CodeBlocksMinGWlibgccmingw324.9.2includec++bitsstl_algo.h|4189|note: template argument deduction/substitution failed:|
C:Usersvitaly.bushaevDocumentsvk cup1.cpp|8|note: candidate expects 5 arguments, 4 provided|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
所以我正在阅读这篇文章,我理解错误,但我不明白为什么会发生这种情况。确保这工作正常:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<char> v{'a', 'b', 'c', 'd'};
using it = std::vector<char>::iterator;
std::transform<it, it, int (int)>(v.begin(), v.end(), v.begin(), std::toupper);
std::for_each(v.begin(), v.end(), [](char & c) {
std::cout << c << " ";
});
}
所以问题来了:
1)为什么c++不能在这里推导出模板参数?
2)有没有办法解决这个问题,不指定类型?
std::toupper
有多个重载。
模板推导发生在重载选择之前,因此您必须是特定的,或者将调用包装在 lambda 或函数对象中。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<char> v{'a', 'b', 'c', 'd'};
// method 1
struct make_upper
{
int operator()(int ch) const { return std::toupper(ch); }
};
std::transform(v.begin(), v.end(), v.begin(), make_upper());
// method 2
std::transform(v.begin(), v.end(), v.begin(), [](auto&& ch) { return std::toupper(ch); });
}
引用:
http://en.cppreference.com/w/cpp/locale/toupperhttp://en.cppreference.com/w/cpp/string/byte/toupper