Рассмотрим следующий код, распределенный по 3 файлам:
// secret.h
#pragma once
class Secret { /* ... */ };
// foo.h
#pragma once
#include "secret.h"
template <typename T>
class Foo {
public:
// Other members ...
void bar();
};
/* Definition is included inside 'foo.h' because Foo is a template class. */
template <typename T> void Foo<T>::bar() {
Secret s;
/* Perform stuff that depend on 'secret.h' ... */
}
// main.cpp
#include "foo.h"
int main() {
Foo<int> foo;
Secret secret; // <--- This shouldn't be allowed, but it is!
return 0;
}
Итак, моя проблема в том, что я хочу скрыть Секрет от пользователя Foo если они явно не используют #include "secret.h"
.Обычно это можно сделать, включив secret.h
в foo.cpp
.Однако это невозможно, поскольку Foo является классом шаблона, и я не могу отделить его определение от его объявления. Явное создание экземпляра шаблона не вариант.
В конечном счете, я хочу знать, возможно ли это каким-либо иным образом, кроме явного создания экземпляра шаблона, и если да, то как?Спасибо!