重载命名空间中定义的函数

时间:2016-06-26 05:02:33

标签: c++ c++11 overloading

为什么以下代码非法?

#include <iostream>
using namespace std;

namespace what {
void print(int count) {
    cout << count << endl;
}
}

void what::print(const string& str) {
    cout << str << endl;
}

int main() {
    what::print(1);
    what::print("aa");

    return 0;
}

使用clang和-std=c++14进行编译时出现的错误是

error: out-of-line definition of 'print' does not match any declaration in namespace 'what'

我知道问题的解决方法,但我想知道为什么编译器认为我试图定义函数(print)而不是重载它。

1 个答案:

答案 0 :(得分:5)

它不适合你的原因是因为语法

function1() {
   let semaphore = dispatch_semaphore_create(0)
   let task = session.dataTaskWithRequest(urlRequest) {
            (data, response, error) -> Void in

                function2()
                dispatch_semaphore_signal(semaphore)
    }
    task.resume()
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)

 }

 function2() {
   let semaphore = dispatch_semaphore_create(0)
   let task = session.dataTaskWithRequest(urlRequest) {
            (data, response, error) -> Void in

                stuff...
                dispatch_semaphore_signal(semaphore)
    }
    task.resume()
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)

 }                              

基本上是在说

  

void what::print(const string& str) 命名空间内,在此处定义what函数

如果要在其命名空间之外定义函数,则必须事先在命名空间中声明它。

  

§13.1标准状态,“当在同一范围内为单个名称指定了两个或更多不同的声明时,表示该名称   要超载。“

函数的重载必须在彼此的相同范围内。这就是语言的运作方式。