如果我在某个地方定义了一个名称空间log,并使它在全局范围内可访问,这将与标准cmath头中的double log(double)冲突。实际上,大多数编译器似乎都赞同它--大多数版本的SunCC、MSVC、GCC --但GCC 4.1.2却不这么做。
不幸的是,似乎无法解决歧义,因为using声明对于命名空间标识符来说是不合法的。您知道有什么方法可以在全局命名空间中编写log::Log,即使包括cmath吗?
谢谢。
编辑:有人知道C++03标准对此有什么看法吗?在下面的代码示例中,我认为作用域运算符充分地消除了log使用的歧义。
#include <cmath>
namespace foo
{
namespace log
{
struct Log { };
} // namespace log
} // namespace foo
using namespace foo;
int main()
{
log::Log x;
return 0;
}
// g++ (GCC) 4.1.2 20070115 (SUSE Linux)
// log.cpp: In function `int main()':
// log.cpp:20: error: reference to `log' is ambiguous
// /usr/include/bits/mathcalls.h:110: error: candidates are: double log(double)
// log.cpp:7: error: namespace foo::log { }
// log.cpp:20: error: expected `;' before `x'发布于 2010-10-06 10:28:06
我建议:
foo::log::Log x; // Your logging class
::log(0.0); // Log function通常,我不会编写using namespace foo;,因为如果您不使用它,并且它污染了全局命名空间,那么在foo命名空间中使用它是没有意义的。
见以下相关问题:
发布于 2010-10-06 10:37:18
虽然这对你没有帮助,但GCC 4.1.2的错误是不正确的。log in log::Log只能引用类或命名空间名称。
如果您的代码还需要使用GCC 4.1.2编译,那么有两个选项:
foo::log::Log namespace log1 = foo::log;
log1::Log logger;发布于 2015-05-06 03:17:04
cmath出于某种原因使用::log从全局范围获取它,并且无法在函数和名称空间之间作出决定。
#include <iostream>
#include <cmath> // Uses ::log, which would be the log() here if it were not in a namespace, see https://stackoverflow.com/questions/11892976/why-is-my-log-in-the-std-namespace
// Silently overrides std::log
//double log(double d) { return 420; }
namespace uniquename {
using namespace std; // So we don't have to waste space on std:: when not needed.
double log(double d) {
return 42;
}
int main() {
cout << "Our log: " << log(4.2) << endl;
cout << "Standard log: " << std::log(4.2);
return 0;
}
}
// Global wrapper for our contained code.
int main() {
return uniquename::main();
}输出:
Our log: 42
Standard log: 1.43508https://stackoverflow.com/questions/3871474
复制相似问题