Hi all,<div><br></div><div>Can anyone explain why the following doesn't compile?</div><div><br></div><div><div>#include <functional></div><div><br></div><div>struct X{</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>typedef std::function<void(X&)> callback_type;</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>virtual ~X() {}</div><div>private:</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>callback_type _cb;</div><div>};</div><div><br></div>
<div>int main(){}</div></div><div><br></div><div><br></div><div>If you comment out the virtual destructor, the code compiles fine.  Full error report:</div><div><br></div><div><br></div><div>################################################</div>
<div>







<p class="p1">CompileC build/test_function_callback.build/Debug/test_function_callback.build/Objects-normal/x86_64/main.o test_function_callback/main.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler</p>
<p class="p1">    cd /Volumes/ssd/code/sandbox/test_function_callback</p>
<p class="p1">    setenv LANG en_US.US-ASCII</p>
<p class="p1">    /Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch x86_64 -fmessage-length=0 -std=gnu++11 -stdlib=libc++ -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wreturn-type -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-sign-compare -Wshorten-64-to-32 -Wno-newline-eof -Wc++11-extensions -DDEBUG=1 -isysroot /Applications/Xcode45-DP2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -fasm-blocks -Wdeprecated-declarations -Winvalid-offsetof -mmacosx-version-min=10.7 -g -fvisibility-inlines-hidden -Wno-sign-conversion -iquote /Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/test_function_callback-generated-files.hmap -I/Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/test_function_callback-own-target-headers.hmap -I/Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/test_function_callback-all-target-headers.hmap -iquote /Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/test_function_callback-project-headers.hmap -I/Volumes/ssd/code/sandbox/test_function_callback/build/Debug/include -I/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -I/Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/DerivedSources/x86_64 -I/Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/DerivedSources -F/Volumes/ssd/code/sandbox/test_function_callback/build/Debug -MMD -MT dependencies -MF /Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/Objects-normal/x86_64/main.d --serialize-diagnostics /Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/Objects-normal/x86_64/main.dia -c /Volumes/ssd/code/sandbox/test_function_callback/test_function_callback/main.cpp -o /Volumes/ssd/code/sandbox/test_function_callback/build/test_function_callback.build/Debug/test_function_callback.build/Objects-normal/x86_64/main.o</p>

<p class="p2"><br></p>
<p class="p1">In file included from /Volumes/ssd/code/sandbox/test_function_callback/test_function_callback/main.cpp:1:</p>
<p class="p1">In file included from /Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:462:</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:2825:19: error: invalid application of 'sizeof' to an incomplete type 'X'</p>

<p class="p1">    static_assert(sizeof(_Tp) > 0, "Type must be complete.");</p>
<p class="p1">                  ^~~~~~~~~~~</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:2830:15: note: in instantiation of template class 'std::__1::__check_complete<X>' requested here</p>

<p class="p1">    : private __check_complete<_Tp></p>
<p class="p1">              ^</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:2812:15: note: in instantiation of template class 'std::__1::__check_complete<X &>' requested here</p>

<p class="p1">      private __check_complete<_T0, _Tp...></p>
<p class="p1">              ^</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:2978:15: note: in instantiation of template class 'std::__1::__check_complete<std::__1::function<void (X &)> &, X &>' requested here</p>

<p class="p1">    : private __check_complete<_Fp, _Args...></p>
<p class="p1">              ^</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:2989:11: note: in instantiation of template class 'std::__1::__invokable_imp<std::__1::function<void (X &)> &, X &>' requested here</p>

<p class="p1">          __invokable_imp<_Fp, _Args...>::value></p>
<p class="p1">          ^</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:1115:33: note: in instantiation of template class 'std::__1::__invokable<std::__1::function<void (X &)> &, X &>' requested here</p>

<p class="p1">    template <class _Fp, bool = __invokable<_Fp&, _ArgTypes...>::value></p>
<p class="p1">                                ^</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:1163:9: note: in instantiation of default argument for '__callable<std::__1::function<void (X &)> >' required here</p>

<p class="p1">        __callable<typename decay<_Fp>::type>::value,</p>
<p class="p1">        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</p>
<p class="p1">/Applications/Xcode45-DP2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:1166:7: note: while substituting deduced template arguments into function template 'operator=' [with _Fp = const std::__1::function<void (X &)> &]</p>

<p class="p1">      operator=(_Fp&&);</p>
<p class="p1">      ^</p>
<p class="p1">/Volumes/ssd/code/sandbox/test_function_callback/test_function_callback/main.cpp:3:8: note: definition of 'X' is not complete until the closing '}'</p>
<p class="p1">struct X{</p>
<p class="p1">       ^</p>
<p class="p1">1 error generated.</p></div><div>################################################</div><div><br></div><div><br></div><div><br></div><div>Please let me know if I should report this as a bug.</div><div><br></div>
<div>Cheers,</div><div>Rich</div>