【发布时间】:2025-11-30 19:00:01
【问题描述】:
令我惊讶的是,以下代码可以编译:
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <cctype>
int main() {
std::string s="nawaz";
std::string S;
std::transform(s.begin(),s.end(), std::back_inserter(S), ::toupper);
std::cout << S ;
}
我原以为它会失败,因为我认为 ::toupper 应该在 std 命名空间中。快速检查 cctype 表明它是,但它是从根名称空间导入的(在那里解决了谜题)。
namespace std
{
// Other similar `using` deleted for brevity.
using ::toupper;
}
所以第一个问题解决了,但如果我也更改上面的 transform() 行:
std::transform(s.begin(),s.end(), std::back_inserter(S), std::toupper);
我现在希望它现在也可以编译。但我得到一个编译器错误:
kk.cpp:12: 错误:没有匹配函数调用 `transform(__gnu_cxx::__normal_iterator
, std::allocator >>, __gnu_cxx::__normal_iterator , std::allocator >>, std::back_insert_iterator<:basic_string std::char_traits>, std::allocator > >, 未解析的重载函数类型>)'
手动编辑也解决了:
kk.cpp:12: error: no matching function for call to
`transform(iterator<std::string>,
iterator<std::string>,
std::back_insert_iterator<std::string>,
<unresolved overloaded function type>)'
我错过了什么?
【问题讨论】:
-
+1 提出这个问题。连我都想知道!
-
对我来说看起来像一个 GCC 错误。我用VC编译没问题。
-
啊,你只是忍不住对那些 g++ 输出微笑。他们是如此充满爱。
-
我做了一些研究,认为它就像 std::toupper 和 ::toupper 在某种微妙的方式上不同,transform 无法处理,但我找不到任何东西。跨度>
-
Comeau Online 也编译代码,英特尔 C++ 也是如此
标签: c++ namespaces std