::运营商必须与tolower()一起使用?

时间:2015-06-13 11:37:03

标签: c++ operators

transform(mystr.begin(), mystr.end(), mystr.begin(), tolower);

我使用transform函数将字符串全部写成小写字母,但即使在写完“using namespace std;”之后在我的程序的顶部,我得到了一大堆错误(如上所述)。当我在tolower参数之前包含::运算符(例如下面)时,我没有。为什么是这样?我认为tolower函数在std命名空间中,它会像我上面那样工作。

transform(mystr.begin(), mystr.end(), mystr.begin(), ::tolower);

我有以下内容:

#include <iostream>
#include <fstream
#include <sstream>
#include <algorithm>
#include <vector>

在错误消息中,我看到:

error: no matching function for call to 'transform(std::basic_string<char>::iterator, ...

然后是'tolower'在参数列表

中的位置
, <unresolved overloaded function type>);'

4 个答案:

答案 0 :(得分:6)

嗯,这有点复杂。添加tolower可能会解决您的问题。然而,还有更多的事情发生。

这两个版本的int std::tolower(int ch); // #include <cctype> template<typename charT> charT std::tolower(charT ch, const std::locale& loc); // #include <locale>

int ::tolower(int ch);    // #include <cctype> or #include <ctype.h>

但也可能有这个版本:

std

因为允许实现将cctype中的名称注入全局名称空间。此外,您不能依赖locale<cctype>是否包括在内,因为任何标准包含也可能包含任何其他标准包含。

您似乎打算使用tolower中的版本。但是,这将是一个错误。如果您查看该版本unsigned char的文档,您将看到该参数应该转换为char ,然后才会传递给该函数。

IOW,将带有负值的tolower传递给#include <cctype> // ... transform(mystr.begin(), mystr.end(), mystr.begin(), [](char ch) { return std::tolower( (unsigned char)ch ); } ); 的cctype版本会导致未定义的行为。 (虽然常见的实现支持它,因为它是一个常见的错误)。

要更正您的代码并仍然使用cctype版本,您可以写:

for (char &ch : mystr)
    ch = std::tolower( (unsigned char)ch );

虽然使用起来似乎有点简单:

<locale>

#include <locale> #include <functional> // ... transform(mystr.begin(), mystr.end(), mystr.begin(), std::bind( std::tolower<char>, std::placeholders::_1, std::locale() ) ); 版本看起来像(记住它是一个函数模板):

std::locale loc;

for ( char &ch : mystr )
    ch = std::tolower(ch, loc);

<?php

require 'vendor/autoload.php';
session_start();        

$client_id = '123456789-qwertyuiop.apps.googleusercontent.com';
$Email_address = '123456789-qwertyuiop@developer.gserviceaccount.com';   
$key_file_location = 'path_to_key/key.p12';     

$client = new Google_Client();      
$client->setApplicationName("Client_Library_Examples");
$key = file_get_contents($key_file_location);    

// separate additional scopes with a comma   
$scopes ="https://www.googleapis.com/auth/calendar.readonly";   
$cred = new Google_Auth_AssertionCredentials(    
    $Email_address,      
    array($scopes),     
    $key         
);      
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {        
    $client->getAuth()->refreshTokenWithAssertion($cred);       
}       
$service = new Google_Service_Calendar($client);    

?>

<html><body>

<?php
$calendarList  = $service->calendarList->listCalendarList();

while(true) {
    foreach ($calendarList->getItems() as $calendarListEntry) {

        echo $calendarListEntry->getSummary()."<br>\n";

        // get events 
        $events = $service->events->listEvents($calendarListEntry->id);

        foreach ($events->getItems() as $event) {
            echo "-----".$event->getSummary()."<br>";
        }
    }
    $pageToken = $calendarList->getNextPageToken();
    if ($pageToken) {
        $optParams = array('pageToken' => $pageToken);
        $calendarList = $service->calendarList->listCalendarList($optParams);
    } else {
        break;
    }
}

?>

答案 1 :(得分:5)

解决tolower之间的重载之间的冲突 <cctype>的{​​{1}}和int tolower(int c)的模板<locale>

<typename charT> charT tolower(charT c, locale const& loc)使用全局范围

答案 2 :(得分:4)

您包含的头文件是什么?请确保您包含<cctype>而不是<ctype.h> ..在<cctype>中,所有函数都已在命名空间标准中定义。

答案 3 :(得分:3)

::就是说它在全局命名空间中。它只是说清楚了