Учти это C ++ 1y код (Живой пример):
#include <iostream>
auto foo();
int main() {
std::cout << foo(); // ERROR!
}
auto foo() {
return 1234;
}
Компилятор (GCC 4.8.1) щедро выдает эту ошибку:
main.cpp: в функции int main ():
main.cpp: 8: 18: ошибка: использование функции «auto foo ()» перед удержанием «auto»
станд :: соиЬ << Foo ();
^
Как мне переслать-объявить foo()
Вот? Или, может быть, более уместно, можно ли форвард-декларировать foo()
?
Я также попытался скомпилировать код, где я пытался объявить foo()
в .h
файл, определенный foo()
так же, как тот, что выше в .cpp
файл, включенный .h
в моем main.cpp
файл, содержащий int main()
и призыв к foo()
и построил их.
Произошла такая же ошибка.
Согласно документу, это было предложено в N3638, это явно допустимо.
Соответствующий фрагмент:
auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int
static auto y = 0.0; // OK: y has type double
auto int r; // error: auto is not a storage-class-specifier
auto f() -> int; // OK: f returns int
auto g() { return 0.0; } // OK: g returns double
auto h(); // OK, h's return type will be deduced when it is defined
Однако это продолжает говорить:
Если для определения типа выражения необходим тип сущности с неопределенным типом заполнителя, программа является некорректной. Но как только в функции замечен оператор возврата, тип возврата, выведенный из этого оператора, можно использовать в остальной части функции, в том числе в других операторах возврата.
auto n = n; // error, n's type is unknown
auto f();
void g() { &f; } // error, f's return type is unknown
auto sum(int i) {
if (i == 1)
return i; // sum's return type is int
else
return sum(i-1)+i; // OK, sum's return type has been deduced
}
Поэтому тот факт, что вы использовали его до его определения, приводит к ошибке.
Других решений пока нет …