#include <iostream>
using namespace std;
class Outer {
struct Inner {
int num;
};
public:
static Inner GetInner() {
return Inner{-101};
}
};
// void func1(Outer::Inner inner) { // [1] Does not compile as expected
// cout << inner.num <<endl;
//}
template <typename Dummy>
void func2(Outer::Inner inner, Dummy = Dummy()) {
cout << inner.num << endl;
}
int main() {
// func1(Outer::GetInner()); // [2] does not compile as expected
func2<int>(Outer::GetInner()); // [3] How does this compile?
// Outer::Inner should not be accessible
// from outside Outer
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgT3V0ZXIgewoJc3RydWN0IElubmVyIHsKCQlpbnQgbnVtOwkKCX07CgkKcHVibGljOgogc3RhdGljIElubmVyIEdldElubmVyKCkgewoJcmV0dXJuIElubmVyey0xMDF9Owp9Cn07CgovLyB2b2lkIGZ1bmMxKE91dGVyOjpJbm5lciBpbm5lcikgeyAgLy8gWzFdIERvZXMgbm90IGNvbXBpbGUgYXMgZXhwZWN0ZWQKLy8JY291dCA8PCBpbm5lci5udW0gPDxlbmRsOwovL30KCnRlbXBsYXRlIDx0eXBlbmFtZSBEdW1teT4Kdm9pZCBmdW5jMihPdXRlcjo6SW5uZXIgaW5uZXIsIER1bW15ID0gRHVtbXkoKSkgewoJY291dCA8PCBpbm5lci5udW0gPDwgZW5kbDsKfQoKCmludCBtYWluKCkgewoJLy8gZnVuYzEoT3V0ZXI6OkdldElubmVyKCkpOyAvLyBbMl0gZG9lcyBub3QgY29tcGlsZSBhcyBleHBlY3RlZCAKCWZ1bmMyPGludD4oT3V0ZXI6OkdldElubmVyKCkpOyAvLyBbM10gSG93IGRvZXMgdGhpcyBjb21waWxlPyAKCQkJCQkJCQkgICAvLyBPdXRlcjo6SW5uZXIgc2hvdWxkIG5vdCBiZSBhY2Nlc3NpYmxlCgkJCQkJCQkJICAgLy8gZnJvbSBvdXRzaWRlIE91dGVyCglyZXR1cm4gMDsKfQ==