使用命名空间&重载功能

时间:2018-03-24 13:27:57

标签: c++ namespaces

我不明白为什么我会收到错误"模糊调用重载函数"。 在" 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 ""
    }
}

4 个答案:

答案 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