candidate template ignored: couldn't infer template argument
I am writing a getline()-like function that can take a predicate, but clang throws
an error, i have little or no idea why it says so
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
template <typename Char, class Traits, class Alloc, class Predicate>
std::basic_istream<Char, Traits>&
getwhile( std::basic_istream<Char, Traits>& stream,
std::basic_string<Char, Traits, Alloc>& str,
Predicate pred )
{
while( Char c = stream.get() ) {
if( !pred( c ) )
break;
str.push_back(c);
}
return stream;
}
// ... blah blah
int main()
{
istringstream getWhileInput( "abcdef$ss" );
std::string input;
getwhile( getWhileInput, input, std::isalpha );
std::cout << "input: " << input << '\n';
}
| |
utility_test.cc:15:5: error: no matching function for call to 'getwhile'
getwhile( getWhileInput, input, std::isalpha );
^~~~~~~~
./../utility.hpp:18:1: note: candidate template ignored: couldn't infer template argument 'Predicate'
getwhile( std::basic_istream<Char, Traits>& stream,
|
http://www.cplusplus.com/reference/cctype/isalpha/
http://www.cplusplus.com/reference/locale/isalpha/
¿which one should be used?
getwhile( getWhileInput, input, ( int(*)(int) )std::isalpha );
I'm not quite sure about the cast, you could also specify it with
getwhile( getWhileInput, input, std::ptr_fun<int,int>(std::isalpha) );
By the way, you may simplify the template parameters of your function
1 2 3 4 5
|
template <class Stream, class String, class Predicate>
Stream& getwhile( Stream &stream, String &s, Predicate pred)
{
typedef typename Stream::char_type Char;
//...
| |
Last edited on
Topic archived. No new replies allowed.