Skip to content

Commit 3c9eb69

Browse files
committed
Entire engine.h in unnamed namespace.
1 parent 7a95a23 commit 3c9eb69

File tree

6 files changed

+83
-0
lines changed

6 files changed

+83
-0
lines changed

caster_odr_hidden_engine/car.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "engine.h"
2+
3+
namespace vehicles {
4+
5+
struct vehicle;
6+
7+
struct car_specs {
8+
int power() const { return 100; }
9+
};
10+
11+
} // namespace vehicles
12+
13+
namespace engine {
14+
namespace {
15+
16+
template <>
17+
struct specs<vehicles::vehicle> : vehicles::car_specs {};
18+
19+
} // namespace
20+
} // namespace engine
21+
22+
int car_power() { return engine::power<vehicles::vehicle>(); }
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
cl car.cc truck.cc vehicle_specs.cc /Fe"show.exe"
2+
.\show
3+
cl truck.cc car.cc vehicle_specs.cc /Fe"show.exe"
4+
.\show
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
set -e
2+
set -x
3+
clang++ -std=c++11 car.cc truck.cc vehicle_specs.cc && ./a.out
4+
clang++ -std=c++11 truck.cc car.cc vehicle_specs.cc && ./a.out
5+
rm a.out

caster_odr_hidden_engine/engine.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#pragma once
2+
3+
namespace engine {
4+
namespace {
5+
6+
template <typename T>
7+
struct specs {
8+
int power() const { return 0; }
9+
};
10+
11+
template <typename T>
12+
using make_specs = specs<T>;
13+
14+
template <typename T>
15+
int power() {
16+
return make_specs<T>().power();
17+
}
18+
19+
} // namespace
20+
} // namespace engine

caster_odr_hidden_engine/truck.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "engine.h"
2+
3+
namespace vehicles {
4+
5+
struct vehicle;
6+
7+
struct truck_specs {
8+
int power() const { return 300; }
9+
};
10+
11+
} // namespace vehicles
12+
13+
namespace engine {
14+
namespace {
15+
16+
template <>
17+
struct specs<vehicles::vehicle> : vehicles::truck_specs {};
18+
19+
} // namespace
20+
} // namespace engine
21+
22+
int truck_power() { return engine::power<vehicles::vehicle>(); }
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <iostream>
2+
3+
int car_power();
4+
int truck_power();
5+
6+
int main() {
7+
std::cout << "car power: " << car_power() << std::endl;
8+
std::cout << "truck power: " << truck_power() << std::endl;
9+
return 0;
10+
}

0 commit comments

Comments
 (0)