Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Compilation issue with custom state type with clang only

Aperta
#48 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
cpp
Ambito
compilers

Direzione di ricerca

Inizia con il reproducer Godbolt collegato e confronta clang++ con i compilatori che lo accettano. Esamina il percorso di inclusione di boost/numeric/odeint.hpp e l’uso di vector_space_algebra con std::pair; il lavoro è completato quando il programma mostrato compila con clang++ senza spostare le definizioni degli operatori prima dell’inclusione di odeint.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

In the code below, I am working with a custom state-type (a std::pair in this case). The code compiles with g++, icc, msvc. With clang however, compilation fails. In order to get it to build successfully, I apparently need to define operator+() and operator*() for the state type before including the odeint header. Link to godbolt: https://godbolt.org/z/6eavzdxbf

#include <cstdlib>
#include <utility>

#include <boost/numeric/odeint.hpp> // if included here, compilations fails with clang++

using state_type = std::pair<double, double>;
using deriv_type = state_type;
using time_type = double;

state_type operator+(state_type a, state_type const& b);
state_type operator*(state_type a, time_type b);
state_type operator*(time_type b, state_type a);

//~ #include <boost/numeric/odeint.hpp> // if included here, no error!

state_type operator+(state_type a, state_type const& b) {
	a.first += b.first;
	a.second += b.second;
	return a;
}

state_type operator*(state_type a, time_type b) {
	a.first *= b;
	a.second *= b;
	return a;
}

state_type operator*(time_type b, state_type a) {
	return a * b;
}

void harmonic_oscillator(const state_type& x, deriv_type& dxdt, time_type) {
	static auto constexpr gam = 0.1;

	dxdt.first = x.second;
	dxdt.second = -x.first - gam*x.second;
}

namespace bno = boost::numeric::odeint;
using stepper_type = bno::runge_kutta_dopri5<state_type, double, deriv_type, time_type, bno::vector_space_algebra>;

int main() {
	state_type x0{1.0, 0.0};
	
	// just to see if the operators work...
	x0 * 1.;
	2. * x0;
	x0 + x0;
	
	stepper_type stepper;
	time_type const dt = 0.005;
	for (time_type t = 0; t < 10; t += dt) {
		stepper.do_step(harmonic_oscillator, x0, t, dt);
		std::cout << t << '\t' << x0.first << '\t' << x0.second << '\n';
	}
	
	return EXIT_SUCCESS;
}
Lingua principale
C++
Stelle
55
Fork
59
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di boostorg/odeint

Tutte le issue di boostorg/odeint

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.