2017-01-31 17 views
0

내가이 작은 예를 들어 내가 그것을 분명 생각표준 알고리즘을 전달 중입니다.

#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:\Users\vitaly.bushaev\Documents\vk cup\1.cpp||In function 'int main()':| 
C:\Users\vitaly.bushaev\Documents\vk cup\1.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:\Users\vitaly.bushaev\Documents\vk cup\1.cpp|8|note: candidates are:| 
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_algo.h|4152|note: template<class _IIter, class _OIter, class _UnaryOperation> _OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation)| 
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_algo.h|4152|note: template argument deduction/substitution failed:| 
C:\Users\vitaly.bushaev\Documents\vk cup\1.cpp|8|note: couldn't deduce template parameter '_UnaryOperation'| 
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_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)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_algo.h|4189|note: template argument deduction/substitution failed:| 
C:\Users\vitaly.bushaev\Documents\vk cup\1.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) 유형을 지정하지 않으려면이 방법이 있습니까?

+0

표준 C의 기능은 헤더의 ToUpper 선언된다. :: toupper와 같은 알고리즘 호출에 포함 시키십시오. –

답변

3

std::toupper에 대해 하나 이상의 오버로드가 있습니다.

과부하 선택 전에 템플릿 차감이 발생하므로 특정 전화이거나 람다 또는 함수 객체로 통화를 감싸 야합니다.

#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/toupper http://en.cppreference.com/w/cpp/string/byte/toupper