[temp.dep.candidate] (original) (raw)
:
Module interface unit of A:
export module A;
export template
void f(T t) {
cat(t, t);
dog(t, t);
}
Module interface unit of B:
export module B; import A; export template<typename T, typename U> void g(T t, U u) { f(t); }
Source file "foo.h", not an importable header:
struct foo { friend int cat(foo, foo); }; int dog(foo, foo);
Module interface unit of C1:
module;
#include "foo.h"
export module C1;
import B;
export template
void h(T t) {
g(foo{ }, t);
}
Translation unit:
import C1;
void i() {
h(0);
}
Importable header "bar.h":
struct bar { friend int cat(bar, bar); }; int dog(bar, bar);
Module interface unit of C2:
module;
#include "bar.h"
export module C2;
import B;
export template
void j(T t) {
g(bar{ }, t);
}
Translation unit:
import C2; void k() { j(0);
}
— end example