Пример одного файла
Вот простая программа, использующая пространства имен.
#include <iostream>
namespace foo {
void hello();
}
void foo::hello() {
std::cout << "hello\n";
}
void foo::hello(); // Why is this syntax allowed? When is it useful?
int main() {
foo::hello();
}
Эта программа прекрасно компилируется и выдает ожидаемый результат.
$ ./a.out
hello
Я хочу знать, когда полезна декларация void foo::hello();
? В этой программе эта декларация явно избыточна. Но поскольку этот синтаксис существует, это должно быть полезно в каком-то другом сценарии?
Пример с двумя файлами
Вот пример, который показывает, что само по себе объявление void foo::hello();
бесполезно.
// foo.cpp
#include <iostream>
namespace foo {
void hello();
}
void foo::hello() {
std::cout << "foo::hello\n";
}
// main.cpp
void foo::hello(); // This does not work!
int main()
{
foo::hello();
}
Попытка скомпилировать два вышеуказанных файла приводит к следующим ошибкам:
$ clang++ foo.cpp main.cpp
main.cpp:1:6: error: use of undeclared identifier 'foo'
void foo::hello();
^
main.cpp:5:5: error: use of undeclared identifier 'foo'
foo::hello();
^
2 errors generated.
Единственный способ исправить main.cpp
в приведенном выше примере - это объявление namespace
:
// main.cpp - fixed
namespace foo {
void hello();
}
void foo::hello(); // But now this is redundant again!
int main()
{
foo::hello();
}
Так что после того, как мы получим этот код для правильной компиляции, объявление void foo::hello();
снова кажется излишним. Есть ли сценарий, в котором такая декларация сыграла бы полезную роль?