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>);'
答案 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)
::
就是说它在全局命名空间中。它只是说清楚了