在命名空间中重载一个函数

3
以下代码为什么是非法的?
#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个回答

5
您遇到问题的原因是语法错误。
void what::print(const string& str)

基本上是说

what 命名空间内,定义 print 函数于此处

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

标准文档的 §13.1 节声明:“当同一作用域中指定一个名称有两个或更多不同的声明时,该名称被认为是重载的。”

函数的重载必须在彼此的同一作用域中。这只是语言的工作方式。


1
函数的重载必须在同一个命名空间中。但是,what::不就是试图做到这一点吗?我认为重点应该更多地放在在相同的作用域内上。试图从不同的命名空间重载函数肯定是不同的作用域。 - Mr. Llama
@Mr.Llama修正了我的答案。 - Greg M
@Mr.Llama 没错,这就是为什么我问这个问题! - Curious
@GregM 只是好奇,你从哪里得到这个标准的?我也想得到一份副本。我在 isocpp.com 上看到你必须付费才能获得。这是必需的吗?还是有合法的在线副本可以获取? - Curious
1
@Curious - 如果你在谷歌上搜索 Greg 回答中精确的短语(“When two or more ... overloaded”),你会发现一些在线网站有这个内容。我找到的第一个例子在这里,但它不是最新的C++14标准。你也可以免费获得C++14 2014年11月工作草案的PDF版本。从同样的链接,你还可以找到C++17草案。 - Mr. Llama
1
@Curious,您可以在https://isocpp.org/std/the-standard上免费查看工作草案。之所以是免费的,是因为它还不是“最终”的版本。只需查找“获取工作草案(草案C++17)的位置”,在该部分中应该有一个草案链接。 - Greg M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接