为什么以下代码非法?
#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
)而不是重载它。
答案 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标准状态,“当在同一范围内为单个名称指定了两个或更多不同的声明时,表示该名称 要超载。“
函数的重载必须在彼此的相同范围内。这就是语言的运作方式。