Учитывая шаблон класса как таковой:
template <typename TYPE>
class SomeClass {
public:
typedef boost::intrusive_ptr<SomeClass<TYPE> > Client_t;
inline Client_t GetClient() { return Client_t(this); }
};
SomeClass предназначен только для использования через ссылки указателей, возвращаемые SomeClass :: GetClient (). Что делает естественным написание функции-оболочки вокруг создания следующим образом:
template <typename TYPE>
SomeClass<TYPE>::Client_t New_SomeClass() {
return (new SomeClass<TYPE>)->GetClient();
}
Компиляция вышеуказанного кода в GCC 4.4:
SomeClass<int>::Client_t some_class = New_SomeClass();
Дает ошибку "New_SomeClass" не был объявлен в этой области "
Теперь я не являюсь мастером шаблонов, поэтому здесь могут быть детали, о которых я не знаю, но я предполагаю, что вообще не могу использовать такую конструкцию из-за того, что C ++ не разрешить перегрузку по типу возврата.
Полагаю, макрос ... дрожь ... решит эту проблему:
#define NEW_SOMECLASS(TYPE) ((new SomeClass<TYPE>)->GetClient())
auto some_class = NEW_SOMECLASS(int);
Но должен быть разумный способ разоблачить создание объектов шаблонного класса, не прибегая к макросам или другим громоздким конструкциям?