I have tried to use your header only library in my test project on MSVS 2017 version 15.3.5 and I get compiler errors. Let me explain the case:
I have 3 header files (A.h, B.h, C.h) which look as follows:
A.h
1>------ Build started: Project: func2-test, Configuration: Debug x64 ------
1>func2test.cpp
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...)>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...)>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) const>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) const>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile const>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile const>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) const &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) const &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile const &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile const &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) const &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) const &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile const &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(522): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<Ret(Args...) volatile const &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...),Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...),Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...)>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...)>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) const,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) const,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) const>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) const>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile const,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile const,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile const>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile const>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) &,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) &,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) const &,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) const &,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) const &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) const &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile &,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile &,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile const &,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile const &,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile const &>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile const &>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) &&,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) &&,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) const &&,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) const &&,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) const &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) const &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile &&,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile &&,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile const &&,Next,Signatures...>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,Function,Ret(Args...) volatile const &&,Next,Signatures...>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): error C2953: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile const &&>': class template has already been defined
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(706): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<Index,fu2::abi_400::detail::function<Config,Property>,Ret(Args...) volatile const &&>'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1301): error C2504: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>,bool (int,int)>': base class undefined
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\a.h(7): note: see reference to class template instantiation 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>' being compiled
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(535): error C2794: 'pointer_type': is not a member of any direct or indirect base class of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(739): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::invocation_table::invoke_table<bool (int,int)>' being compiled
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1014): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::tables::vtable<Property>' being compiled
1> with
1> [
1> Property=fu2::abi_400::detail::property<true,false,bool (int,int)>
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1343): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::erasure<true,Config,fu2::abi_400::detail::property<true,false,bool (int,int)>>' being compiled
1> with
1> [
1> Config=fu2::abi_400::detail::config<true,false,fu2::capacity_default>
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(535): error C2938: 'function_pointer_of<bool(int,int)>' : Failed to specialize alias template
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1472): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>,bool (int,int)>'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1297): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>,bool (int,int)>'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1472): error C2873: '()': symbol cannot be used in a using-declaration
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1242): error C2903: 'callable': symbol is neither a class template nor a function template
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\a.h(10): note: see reference to class template instantiation 'fu2::abi_400::detail::accepts_one<A::{ctor}::<lambda_480bcf0fb16eb88925f8ee9c4addaec8>,bool (int,int),fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>>' being compiled
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1242): error C2062: type 'unknown-type' unexpected
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1243): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1245): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1245): error C2065: 'value': undeclared identifier
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1246): error C2903: 'callable': symbol is neither a class template nor a function template
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1246): error C2062: type 'unknown-type' unexpected
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1247): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (int,int)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1247): error C2975: 'RequiresNoexcept': invalid template argument for 'fu2::abi_400::detail::invocation::is_noexcept_correct', expected compile-time constant expression
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(204): note: see declaration of 'RequiresNoexcept'
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\a.h(10): error C2679: binary '=': no operator found which takes a right-hand operand of type 'A::{ctor}::<lambda_480bcf0fb16eb88925f8ee9c4addaec8>' (or there is no acceptable conversion)
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1427): note: could be 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>> &fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>::operator =(std::nullptr_t)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1394): note: or 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>> &fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>::operator =(fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>> &&) noexcept(<expr>)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1393): note: or 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>> &fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>::operator =(const fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>> &)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\a.h(10): note: while trying to match the argument list '(fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,false,Capacity>,fu2::abi_400::detail::property<true,false,bool (int,int)>>, A::{ctor}::<lambda_480bcf0fb16eb88925f8ee9c4addaec8>)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1301): error C2504: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>,bool (std::string,std::string)>': base class undefined
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\b.h(8): note: see reference to class template instantiation 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>' being compiled
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(535): error C2794: 'pointer_type': is not a member of any direct or indirect base class of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (std::string,std::string)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(739): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::invocation_table::invoke_table<bool (std::string,std::string)>' being compiled
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1014): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::tables::vtable<Property>' being compiled
1> with
1> [
1> Property=fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1343): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::erasure<true,Config,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>' being compiled
1> with
1> [
1> Config=fu2::abi_400::detail::config<true,true,fu2::capacity_default>
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(535): error C2938: 'function_pointer_of<bool(std::string,std::string)>' : Failed to specialize alias template
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1472): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>,bool (std::string,std::string)>'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1297): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>,bool (std::string,std::string)>'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1243): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (std::string,std::string)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (std::string,std::string)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1245): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (std::string,std::string)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (std::string,std::string)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1247): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (std::string,std::string)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (std::string,std::string)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\b.h(11): error C2679: binary '=': no operator found which takes a right-hand operand of type 'B::{ctor}::<lambda_f3910cc3aea2b6888fed6879cd649046>' (or there is no acceptable conversion)
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1427): note: could be 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>> &fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>::operator =(std::nullptr_t)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1394): note: or 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>> &fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>::operator =(fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>> &&) noexcept(<expr>)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1393): note: or 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>> &fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>::operator =(const fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>> &)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\b.h(11): note: while trying to match the argument list '(fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (std::string,std::string)>>, B::{ctor}::<lambda_f3910cc3aea2b6888fed6879cd649046>)'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1301): error C2504: 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (long,long)>>,bool (long,long)>': base class undefined
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\c.h(9): note: see reference to class template instantiation 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (long,long)>>' being compiled
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(535): error C2794: 'pointer_type': is not a member of any direct or indirect base class of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (long,long)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(739): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::invocation_table::invoke_table<bool (long,long)>' being compiled
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1014): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::tables::vtable<Property>' being compiled
1> with
1> [
1> Property=fu2::abi_400::detail::property<true,false,bool (long,long)>
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1343): note: see reference to class template instantiation 'fu2::abi_400::detail::type_erasure::erasure<true,Config,fu2::abi_400::detail::property<true,false,bool (long,long)>>' being compiled
1> with
1> [
1> Config=fu2::abi_400::detail::config<true,true,fu2::capacity_default>
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(535): error C2938: 'function_pointer_of<bool(long,long)>' : Failed to specialize alias template
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1472): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (long,long)>>,bool (long,long)>'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1297): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::operator_impl<0,fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (long,long)>>,bool (long,long)>'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1243): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (long,long)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (long,long)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1245): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (long,long)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (long,long)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(1247): error C2027: use of undefined type 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (long,long)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\lib\function2\include\function2\function2.hpp(471): note: see declaration of 'fu2::abi_400::detail::type_erasure::invocation_table::function_trait<First>'
1> with
1> [
1> First=bool (long,long)
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\c.h(9): error C2664: 'fu2::abi_400::detail::function<fu2::abi_400::detail::config<true,true,Capacity>,fu2::abi_400::detail::property<true,false,bool (long,long)>>::function(std::nullptr_t)': cannot convert argument 1 from 'C::<lambda_f6cd4ad39bd83322785042c7b76f3bda>' to 'std::nullptr_t'
1> with
1> [
1> Capacity=fu2::capacity_default
1> ]
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\c.h(9): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\func2test.cpp(9): error C2064: term does not evaluate to a function taking 2 arguments
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\func2test.cpp(10): error C2064: term does not evaluate to a function taking 2 arguments
1>d:\programming\cpp\3rdparty\tmp_project\func2-test\src\func2test.cpp(11): error C2064: term does not evaluate to a function taking 2 arguments
1>Done building project "func2-test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
I think the compiling should go through also with the settings for C++17 on MSVS 2017.
Compiler error if Language Standard is set to c++17 or latest.
Written above in the description of my problem.