Здравствуйте, rg45, Вы писали:
R>Сразу обрати внимание на ограничение: такие специализации можно сделать либо в том же, либо в обрамляющем пространстве имен (с явной спецификацией пространства имен). Если окажется, что "использование" происходит в каком-нибудь вложенном или несвязанном пространстве имен, то это может серьезно осложнить задачу. И в области видимости классов специализации делать не разрешается по стандарту, хоть некоторые компиляторы (msvc, например) и поддерживают эту возможность.
Зачем делать явную специализацию? Это какое-то ненужное переусложнение.
Достаточно в месте "использования" потрогать переменную любым способом (который ODR-used).
Ну то есть написать в once.h#pragma once
template <typename T> int instance_me_only_once = 0;
А потом в люом месте включать этот заголовочный файл и трогать переменную:#include <once.h>
namespace Whatever {
template <class Foo>
struct Bar {
Bar() {
++instance_me_only_once<Foo>;
Use<Foo>();
}
}
}
Теперь если в другой единице трансляции тоже сделать ++instance_me_only_once<Foo>, то программа не соберётся.