Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor #1091

Open
ryandesign opened this issue Apr 26, 2021 · 6 comments

Comments

@ryandesign
Copy link

Hello, QuantLib 1.22 fails to build on OS X 10.11.6 using the compiler Apple LLVM version 8.0.0 (clang-800.0.42.1) that comes with Xcode 8.2.1:

nthorderderivativeop.cpp:59:41: error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor
        const ext::function<Real(Real)> emptyFct;
                                        ^
                                                {}

Here's a full build log from the MacPorts buildbot system.

QuantLib claims to only require C++11, and Apple clang 500.2.75 and later are supposed to support C++11, and I am manually adding -std=c++11 to CXXFLAGS to turn C++11 mode on (since the build system doesn't do it automatically), so I would expect this to work.

Building on OS X 10.11.6 with open source clang 9.0.1 as installed by MacPorts works.

Building on macOS 10.12.6 with Apple LLVM version 9.0.0 (clang-900.0.39.2) from Xcode 9.2 works, as does Apple clang from newer Xcodes on newer macOS versions.

I'm not familiar with modern C++ so I wanted to report this in case maybe you are accidentally using C++ features that are from a later standard than C++11, or if this is a compiler bug then maybe there is something you could do to work around it.

@lballabio
Copy link
Owner

I'm a bit wary of saying it's a compiler problem, but it looks like it. May you try and see if this workaround fixes the issue?

diff --git a/ql/methods/finitedifferences/operators/nthorderderivativeop.cpp b/ql/methods/finitedifferences/operators/nthorderderivativeop.cpp
index b15eeeeba..a61e6e153 100644
--- a/ql/methods/finitedifferences/operators/nthorderderivativeop.cpp
+++ b/ql/methods/finitedifferences/operators/nthorderderivativeop.cpp
@@ -56,7 +56,7 @@ namespace QuantLib {
              "inconsistent number of points");
 
         Array xOffsets(nPoints);
-        const ext::function<Real(Real)> emptyFct;
+        ext::function<Real(Real)> emptyFct;
 
         for (FdmLinearOpIterator iter = layout->begin(); iter!=endIter; ++iter) {
             const auto ix = Integer(iter.coordinates()[direction]);

@github-actions
Copy link
Contributor

This issue was automatically marked as stale because it has been open 60 days with no activity. Remove stale label or comment, or this will be closed in two weeks.

@github-actions github-actions bot added the stale label Jun 26, 2021
@ryandesign
Copy link
Author

May you try and see if this workaround fixes the issue?

That does get past that error. The next error I see is:

fdmtimedepdirichletboundary.cpp:33:34: error: constructor for 'QuantLib::FdmTimeDepDirichletBoundary' must explicitly initialize the const member
'valuesOnBoundary_'
    FdmTimeDepDirichletBoundary::FdmTimeDepDirichletBoundary(
                                 ^
../../../../ql/methods/finitedifferences/utilities/fdmtimedepdirichletboundary.hpp:63:54: note: 'valuesOnBoundary_' declared here
        const ext::function<Disposable<Array>(Real)> valuesOnBoundary_;
                                                     ^
fdmtimedepdirichletboundary.cpp:41:34: error: constructor for 'QuantLib::FdmTimeDepDirichletBoundary' must explicitly initialize the const member
'valueOnBoundary_'
    FdmTimeDepDirichletBoundary::FdmTimeDepDirichletBoundary(
                                 ^
../../../../ql/methods/finitedifferences/utilities/fdmtimedepdirichletboundary.hpp:62:42: note: 'valueOnBoundary_' declared here
        const ext::function<Real (Real)> valueOnBoundary_;
                                         ^
2 errors generated.

@lballabio
Copy link
Owner

Try removing the const from the two declarations listed (ql/methods/finitedifferences/utilities/fdmtimedepdirichletboundary.hpp, lines 62 and 63.)

@github-actions github-actions bot removed the stale label Jun 27, 2021
@ryandesign
Copy link
Author

The next error then is:

numericaldifferentiation.cpp:72:37: error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor
    const ext::function<Real(Real)> f;
                                    ^
                                     {}
numericaldifferentiation.cpp:102:37: error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor
    const ext::function<Real(Real)> f;
                                    ^
                                     {}
numericaldifferentiation.cpp:129:37: error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor
    const ext::function<Real(Real)> f;
                                    ^
                                     {}
numericaldifferentiation.cpp:156:37: error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor
    const ext::function<Real(Real)> f;
                                    ^
                                     {}
numericaldifferentiation.cpp:175:37: error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor
    const ext::function<Real(Real)> f;
                                    ^
                                     {}
numericaldifferentiation.cpp:279:37: error: default initialization of an object of const type 'const ext::function<Real (Real)>' (aka 'const function<double (double)>') without a user-provided default constructor
    const ext::function<Real(Real)> f;
                                    ^
                                     {}
6 errors generated.

If I remove these consts in test-suite/numericaldifferentiation.cpp, then the build succeeds.

It sounds like the compiler is suggesting that inserting {} where indicated would fix this. If I leave the const and add the {} where shown, that build also succeeds.

@lballabio
Copy link
Owner

Thanks! Leaving the const and adding the {} is probably better. I'd try that with the previous errors, as well.

Once it works, may you create a pull request with the changes?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants