boostorg / boostorg/ublas

ublas::matrix broken with compiler error with build 1.80 but not 1.63

Open
#179 2 comments 1 reaction 0 assignees View on GitHub
Dominant language
C++
Stars
122
Forks
151
PR merge metrics
No merged PRs in 30d

Description

Was trying to compile the following code and received the following error information.

## Code:

```
#include

int main()
{
boost::numeric::ublas::matrix u;

u = u / norm_frobenius(u); // u /= norm_frobenius(u) works

return 0;
}
```

## Error:
```
In file included from /opt/boost/boost/typeof/typeof.hpp:216,
from /opt/boost/boost/numeric/ublas/traits.hpp:29,
from /opt/boost/boost/numeric/ublas/storage.hpp:27,
from /opt/boost/boost/numeric/ublas/vector.hpp:21,
from /opt/boost/boost/numeric/ublas/matrix.hpp:18,
from example.cpp:1:
/opt/boost/boost/numeric/ublas/traits.hpp: In instantiation of ‘struct boost::numeric::ublas::promote_traits, boost::numeric::ublas::matrix_norm_frobenius > > >’:
/opt/boost/boost/numeric/ublas/functional.hpp:126:63: required from ‘struct boost::numeric::ublas::scalar_binary_functor, boost::numeric::ublas::matrix_norm_frobenius > > >’
/opt/boost/boost/numeric/ublas/functional.hpp:166:12: required from ‘struct boost::numeric::ublas::scalar_divides, boost::numeric::ublas::matrix_norm_frobenius > > >’
/opt/boost/boost/numeric/ublas/matrix_expression.hpp:3491:34: required from ‘class boost::numeric::ublas::matrix_binary_scalar2, const boost::numeric::ublas::matrix_scalar_unary, boost::numeric::ublas::matrix_norm_frobenius > >, boost::numeric::ublas::scalar_divides, boost::numeric::ublas::matrix_norm_frobenius > > > >’
example.cpp:7:29: required from here
/opt/boost/boost/numeric/ublas/traits.hpp:154:40: error: no matching function for call to ‘boost::numeric::ublas::matrix_scalar_unary, boost::numeric::ublas::matrix_norm_frobenius > >::matrix_scalar_unary()’
154 | typedef BOOST_TYPEOF_TPL(X() + Y()) promote_type;
| ^~~
/opt/boost/boost/typeof/decltype.hpp:17:69: note: in definition of macro ‘BOOST_TYPEOF’
17 | #define BOOST_TYPEOF(expr) boost::type_of::remove_cv_ref_t
| ^~~~
/opt/boost/boost/numeric/ublas/traits.hpp:154:17: note: in expansion of macro ‘BOOST_TYPEOF_TPL’
154 | typedef BOOST_TYPEOF_TPL(X() + Y()) promote_type;
| ^~~~~~~~~~~~~~~~
In file included from /opt/boost/boost/numeric/ublas/matrix.hpp:19,
from example.cpp:1:
/opt/boost/boost/numeric/ublas/matrix_expression.hpp:5637:11: note: candidate: ‘boost::numeric::ublas::matrix_scalar_unary::matrix_scalar_unary(const expression_type&) [with E = boost::numeric::ublas::matrix; F = boost::numeric::ublas::matrix_norm_frobenius >; boost::numeric::ublas::matrix_scalar_unary::expression_type = boost::numeric::ublas::matrix]’
5637 | explicit matrix_scalar_unary (const expression_type &e):
| ^~~~~~~~~~~~~~~~~~~
/opt/boost/boost/numeric/ublas/matrix_expression.hpp:5637:11: note: candidate expects 1 argument, 0 provided
/opt/boost/boost/numeric/ublas/matrix_expression.hpp:5627:7: note: candidate: ‘constexpr boost::numeric::ublas::matrix_scalar_unary, boost::numeric::ublas::matrix_norm_frobenius > >::matrix_scalar_unary(const boost::numeric::ublas::matrix_scalar_unary, boost::numeric::ublas::matrix_norm_frobenius > >&)’
5627 | class matrix_scalar_unary:
| ^~~~~~~~~~~~~~~~~~~
/opt/boost/boost/numeric/ublas/matrix_expression.hpp:5627:7: note: candidate expects 1 argument, 0 provided
/opt/boost/boost/numeric/ublas/matrix_expression.hpp:5627:7: note: candidate: ‘constexpr boost::numeric::ublas::matrix_scalar_unary, boost::numeric::ublas::matrix_norm_frobenius > >::matrix_scalar_unary(boost::numeric::ublas::matrix_scalar_unary, boost::numeric::ublas::matrix_norm_frobenius > >&&)’
/opt/boost/boost/numeric/ublas/matrix_expression.hpp:5627:7: note: candidate expects 1 argument, 0 provided
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the example with Boost 1.80 and 1.63, then read boost/numeric/ublas/traits.hpp, functional.hpp, and matrix_expression.hpp around the reported instantiations. Compare the failing u = u / norm_frobenius(u) expression with the working /= form; done means the reported expression compiles as it did in 1.63 without breaking the existing behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.