我不明白为什么我会收到错误"模糊调用重载函数"。 在" main"之前,我声明使用命名空间" second"。 我的预期输出是:
这是第一个foo 这是第二个foo 这是第二个foo
func convertDateFormat(sourceString : String, sourceFormat : String, destinationFormat : String) -> String{
let dateFormatter = DateFormatter();
dateFormatter.dateFormat = sourceFormat;
if let date = dateFormatter.date(from: sourceString){
dateFormatter.dateFormat = destinationFormat;
return dateFormatter.string(from: date)
}else{
return ""
}
}
答案 0 :(得分:3)
在" main"之前,我声明使用命名空间" second"。
执行此操作时,second::foo
会引入全局命名空间,然后foo();
second::foo
和::foo
都是有效的候选人。
您可以指定要明确调用全局foo
,即
::foo();
或在main()
内使用using-declaration代替using-directive,例如
int main() {
using second::foo;
first::foo();
second::foo();
foo();
}
答案 1 :(得分:2)
发生这种情况的原因是:using namespace second;
执行此操作时,您将foo()
命名空间中的函数second
限定为全局范围。在全局范围内,存在具有完全相同签名的另一个函数foo()
。现在,您拨打first::foo()
和second::foo()
的电话很好。但是,当您接到对foo()
的调用时,编译器不知道它是应该只调用foo()
还是second::foo()
,因为它们不明确,此时它们都在全局命名空间。
答案 2 :(得分:1)
您的using namespace second;
正是您收到错误的原因。它实际上告诉编译器将second::foo
视为在全局命名空间中。所以现在你有两个foo
。
顺便说一句,void main
无效C ++。它必须是int main
。
答案 3 :(得分:1)
首先,将int main() {
return 0;
}
替换为
using namespace second;
其次,main()
应位于namespace
内,您可以在其中调用特定::scope resolution operator
,而不是全局。
最后,如果您使用的是using namespace second
,那么您不必在main()中提及int main() {
first::foo(); /* first foo will be called */
second::foo(); /* second foo() will be called */
foo(); /* global foo() will be called */
return 0;
}
,请使用其中之一。
就像下面这样做
Conventionnement