2014-08-27 2 views
1

Я пытаюсь распечатать числа от 1 до 1000 в C++ без каких-либо контрольных операторов или условных обозначений. Я нашел this question + answer on SO, но я не могу скомпилировать его на Linux с gcc 4.8. Любые идеи, почему это не работает?Почему эта рекурсия шаблона не будет компилироваться?

Это код, который я пытаюсь:

#include <iostream> 
template<int N> 
struct NumberGeneration{ 
    static void out(std::ostream& os) 
    { 
    NumberGeneration<N-1>::out(os); 
    os << N << std::endl; 
    } 
}; 
template<> 
struct NumberGeneration<1>{ 
    static void out(std::ostream& os) 
    { 
    os << 1 << std::endl; 
    } 
}; 
int main(){ 
    NumberGeneration<1000>::out(std::cout); 
} 

Ошибка я получаю это:

main2.cpp:9:34: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) instantiating ‘struct NumberGeneration<100>’ 
    NumberGeneration<N-1>::out(os); 
           ^
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:9:34: error: incomplete type ‘NumberGeneration<100>’ used in nested name specifier 
main2.cpp:10:8: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT = char; _Traits = std::char_traits<char>]’ 
    os << N << std::endl; 
     ^
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:10:8: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting ‘template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char) [with _Traits = std::char_traits<char>]’ 
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:10:8: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting ‘template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char) [with _Traits = std::char_traits<char>]’ 
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:10:8: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting ‘template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char) [with _Traits = std::char_traits<char>]’ 
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:10:13: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT) [with _CharT = char; _Traits = std::char_traits<char>]’ 
    os << N << std::endl; 
      ^
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:10:13: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>]’ 
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:10:13: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting ‘template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::endl(std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’ 
main2.cpp:9:34: recursively required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 999; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:9:34: required from ‘static void NumberGeneration<N>::out(std::ostream&) [with int N = 1000; std::ostream = std::basic_ostream<char>]’ 
main2.cpp:21:28: required from here 

main2.cpp:10:13: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘<unresolved overloaded function type>’) 
main2.cpp:10:13: note: candidates are: 
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:108:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(__ostream_type& (*__pf)(__ostream_type&)) 
    ^
/usr/include/c++/4.8/ostream:108:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}’ 
/usr/include/c++/4.8/ostream:117:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>; std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] 
     operator<<(__ios_type& (*__pf)(__ios_type&)) 
    ^
/usr/include/c++/4.8/ostream:117:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::basic_ostream<char>::__ios_type& (*)(std::basic_ostream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}’ 
/usr/include/c++/4.8/ostream:127:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(ios_base& (*__pf) (ios_base&)) 
    ^
/usr/include/c++/4.8/ostream:127:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::ios_base& (*)(std::ios_base&)’ 
/usr/include/c++/4.8/ostream:166:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(long __n) 
    ^
/usr/include/c++/4.8/ostream:166:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘long int’ 
/usr/include/c++/4.8/ostream:170:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(unsigned long __n) 
    ^
/usr/include/c++/4.8/ostream:170:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘long unsigned int’ 
/usr/include/c++/4.8/ostream:174:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(bool __n) 
    ^
/usr/include/c++/4.8/ostream:174:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘bool’ 
In file included from /usr/include/c++/4.8/ostream:609:0, 
       from /usr/include/c++/4.8/iostream:39, 
       from main2.cpp:1: 
/usr/include/c++/4.8/bits/ostream.tcc:91:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char; _Traits = std::char_traits<char>] 
    basic_ostream<_CharT, _Traits>:: 
    ^
/usr/include/c++/4.8/bits/ostream.tcc:91:5: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘short int’ 
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:181:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(unsigned short __n) 
    ^
/usr/include/c++/4.8/ostream:181:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘short unsigned int’ 
In file included from /usr/include/c++/4.8/ostream:609:0, 
       from /usr/include/c++/4.8/iostream:39, 
       from main2.cpp:1: 
/usr/include/c++/4.8/bits/ostream.tcc:105:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char; _Traits = std::char_traits<char>] 
    basic_ostream<_CharT, _Traits>:: 
    ^
/usr/include/c++/4.8/bits/ostream.tcc:105:5: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘int’ 
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:192:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(unsigned int __n) 
    ^
/usr/include/c++/4.8/ostream:192:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘unsigned int’ 
/usr/include/c++/4.8/ostream:201:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(long long __n) 
    ^
/usr/include/c++/4.8/ostream:201:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘long long int’ 
/usr/include/c++/4.8/ostream:205:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(unsigned long long __n) 
    ^
/usr/include/c++/4.8/ostream:205:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘long long unsigned int’ 
/usr/include/c++/4.8/ostream:220:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(double __f) 
    ^
/usr/include/c++/4.8/ostream:220:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘double’ 
/usr/include/c++/4.8/ostream:224:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(float __f) 
    ^
/usr/include/c++/4.8/ostream:224:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘float’ 
/usr/include/c++/4.8/ostream:232:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(long double __f) 
    ^
/usr/include/c++/4.8/ostream:232:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘long double’ 
/usr/include/c++/4.8/ostream:245:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] 
     operator<<(const void* __p) 
    ^
/usr/include/c++/4.8/ostream:245:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘const void*’ 
In file included from /usr/include/c++/4.8/ostream:609:0, 
       from /usr/include/c++/4.8/iostream:39, 
       from main2.cpp:1: 
/usr/include/c++/4.8/bits/ostream.tcc:119:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>] 
    basic_ostream<_CharT, _Traits>:: 
    ^
/usr/include/c++/4.8/bits/ostream.tcc:119:5: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::basic_ostream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}’ 
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:548:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*) 
    operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s) 
    ^
/usr/include/c++/4.8/ostream:548:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘const unsigned char*’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:543:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*) 
    operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s) 
    ^
/usr/include/c++/4.8/ostream:543:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘const signed char*’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:530:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*) 
    operator<<(basic_ostream<char, _Traits>& __out, const char* __s) 
    ^
/usr/include/c++/4.8/ostream:530:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘const char*’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/ostream:609:0, 
       from /usr/include/c++/4.8/iostream:39, 
       from main2.cpp:1: 
/usr/include/c++/4.8/bits/ostream.tcc:321:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) 
    operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s) 
    ^
/usr/include/c++/4.8/bits/ostream.tcc:321:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘const char*’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:513:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*) 
    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s) 
    ^
/usr/include/c++/4.8/ostream:513:5: note: substitution of deduced template arguments resulted in errors seen above 
/usr/include/c++/4.8/ostream:493:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char) 
    operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c) 
    ^
/usr/include/c++/4.8/ostream:493:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘unsigned char’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:488:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char) 
    operator<<(basic_ostream<char, _Traits>& __out, signed char __c) 
    ^
/usr/include/c++/4.8/ostream:488:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘signed char’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:482:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char) 
    operator<<(basic_ostream<char, _Traits>& __out, char __c) 
    ^
/usr/include/c++/4.8/ostream:482:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘char’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:476:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) 
    operator<<(basic_ostream<_CharT, _Traits>& __out, char __c) 
    ^
/usr/include/c++/4.8/ostream:476:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: cannot convert ‘std::endl’ (type ‘<unresolved overloaded function type>’) to type ‘char’ 
    os << N << std::endl; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main2.cpp:1: 
/usr/include/c++/4.8/ostream:471:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT) 
    operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c) 
    ^
/usr/include/c++/4.8/ostream:471:5: note: substitution of deduced template arguments resulted in errors seen above 
In file included from /usr/include/c++/4.8/string:52:0, 
       from /usr/include/c++/4.8/bits/locale_classes.h:40, 
       from /usr/include/c++/4.8/bits/ios_base.h:41, 
       from /usr/include/c++/4.8/ios:42, 
       from /usr/include/c++/4.8/ostream:38, 
       from /usr/include/c++/4.8/iostream:39, 
       from main2.cpp:1: 
/usr/include/c++/4.8/bits/basic_string.h:2753:5: note: template<class _CharT, class _Traits, class _Alloc> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::basic_string<_CharT, _Traits, _Alloc>&) 
    operator<<(basic_ostream<_CharT, _Traits>& __os, 
    ^
/usr/include/c++/4.8/bits/basic_string.h:2753:5: note: template argument deduction/substitution failed: 
main2.cpp:10:13: note: couldn't deduce template parameter ‘_Alloc’ 
    os << N << std::endl; 
      ^

И когда я увеличиваю template instantiation depth я получаю:

$ gcc -Wall -ftemplate-depth=1100 -omain2 main2.cpp 
/tmp/ccI81cmF.o: In function `main': 
main2.cpp:(.text+0x5): undefined reference to `std::cout' 
/tmp/ccI81cmF.o: In function `__static_initialization_and_destruction_0(int, int)': 
main2.cpp:(.text+0x38): undefined reference to `std::ios_base::Init::Init()' 
main2.cpp:(.text+0x47): undefined reference to `std::ios_base::Init::~Init()' 
/tmp/ccI81cmF.o: In function `NumberGeneration<1>::out(std::ostream&)': 
main2.cpp:(.text._ZN16NumberGenerationILi1EE3outERSo[_ZN16NumberGenerationILi1EE3outERSo]+0x19): undefined reference to `std::ostream::operator<<(int)' 
main2.cpp:(.text._ZN16NumberGenerationILi1EE3outERSo[_ZN16NumberGenerationILi1EE3outERSo]+0x1e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' 
main2.cpp:(.text._ZN16NumberGenerationILi1EE3outERSo[_ZN16NumberGenerationILi1EE3outERSo]+0x26): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' 
/tmp/ccI81cmF.o: In function `NumberGeneration<1000>::out(std::ostream&)': 
main2.cpp:(.text._ZN16NumberGenerationILi1000EE3outERSo[_ZN16NumberGenerationILi1000EE3outERSo]+0x25): undefined reference to `std::ostream::operator<<(int)' 
main2.cpp:(.text._ZN16NumberGenerationILi1000EE3outERSo[_ZN16NumberGenerationILi1000EE3outERSo]+0x2a): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' 
main2.cpp:(.text._ZN16NumberGenerationILi1000EE3outERSo[_ZN16NumberGenerationILi1000EE3outERSo]+0x32): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' 
+0

Какие у вас были ошибки? – 0x499602D2

+0

Работает для меня. Должны ли мы догадываться, что такое ошибка? –

+3

Возможно, вам необходимо увеличить лимит глубины создания шаблона. – 0x499602D2

ответ

3

Как в комментарии, вы достигнете предела глубины шаблона и используете неправильный компилятор: , поэтому используйте компилятор Си ++ в г ++

И тогда вы можете передать этот аргумент, чтобы увеличить предел глубины -depth=1000

или вы можете создать экземпляр промежуточного шаблона в

template struct NumberGeneration<500>; 

или переписать шаблон не использовать глубину линейной с N что-то вроде следующего

// index_sequence and make_index_sequence available in C++14, but not in C++11 
template <std::size_t...> struct index_sequence {}; 

namespace detail 
{ 
template <typename, typename> struct concat; 

template <std::size_t... Is1, std::size_t... Is2> 
struct concat<index_sequence<Is1...>, index_sequence<Is2...>> : 
    index_sequence<Is1..., (sizeof...(Is1) + Is2)...> 
{ 
    using type = index_sequence<Is1..., (sizeof...(Is1) + Is2)...>; 
}; 

} 

template <std::size_t N> 
struct make_index_sequence : 
    detail::concat<typename make_index_sequence<N/2>::type, 
    typename make_index_sequence<N - N/2>::type>::type 
{ 
    using type = typename 
     detail::concat<typename make_index_sequence<N/2>::type, 
         typename make_index_sequence<N - N/2>::type>::type; 
}; 

template <> 
struct make_index_sequence<1u> : index_sequence<0u> { 
    using type = index_sequence<0u>; 
}; 

template <> 
struct make_index_sequence<0u> : index_sequence<> { 
    using type = index_sequence<>; 
}; 

А потом с VARIADIC шаблона:

template<int N> 
struct NumberGeneration{ 
    static void out(std::ostream& os) 
    { 
    out(make_index_sequence<N>(), os); 
    } 
private: 
    template<std::size_t ...Is> 
    static void out(index_sequence<Is...>, std::ostream& os) 
    { 
     std::initializer_list<int>{ ((os << (1 + Is) << std::endl), void(), 0)...}; 
    } 
}; 

Live example

+0

Симпатичный трюк:' template struct index_sequence {using type = index_sequence; }; '(новый' using' в нем) вверху и вы удаляете дублирование кода в 'make_index_sequence' и в другом месте, включая опечатку в' make_index_sequence <0> ',' concat' и т. д. – Yakk

1

Большая проблема в том, что это на самом деле плохо C++. Он имеет глубину создания экземпляра глубиной 1000 глубин, а стандарт C++ 11 рекомендует только 900. Что еще, мало что нужно для чего-то, что глубоко для выполнения такой простой задачи.

Большинство компиляторов имеют флаги модификации глубины модификации шаблона, которые делают его более крупным. Это, однако, патч над проблемой. Правильный способ исправить этот код - либо не писать, либо уменьшать глубину.

#include <iostream> 
template<int Max, unsigned Count=Max> 
struct NumberGeneration{ 
    void operator()(std::ostream& os) const 
    { 
    NumberGeneration<Max, (Count+1)/2>()(os); 
    NumberGeneration<Max-(Count+1)/2, (Count)/2>()(os); 
    } 
}; 
template<int Max> 
struct NumberGeneration<Max, 1>{ 
    void operator()(std::ostream& os) const 
    { 
    os << Max << std::endl; 
    } 
}; 
// not required: 
template<int Max> 
struct NumberGeneration<Max, 0>{ 
    void operator()(std::ostream& os) const 
    {} 
}; 
int main(){ 
    NumberGeneration<1000>()(std::cout); 
} 

В настоящее время он имеет рекурсивную глубину создания экземпляра около 10, а не 1000, и почти такая же простая, как и исходная версия. Я просто заменил одну рекурсию на разделение и завоевание.

В C++ 14 существуют эффективные списки целых чисел через std::integral_sequence и позволяют сделать это более простым.

Я также сделал NumberGeneration<X> в неактуальный тип без гражданства вместо метода static void out().

+0

Можете ли вы немного подробнее остановиться на 'тип безгосударственного типа '? Что именно и почему вы его использовали? – Patryk

+1

@Patryk a 'class' с' operator() 'invokable. Он не имеет состояния, если нет состояния - данные не хранятся в 'class'. 'std :: less ' является примером такого класса. – Yakk

Смежные вопросы