2013-06-09 2 views
1

Внутри объявления класса Density, я построил эти функции члена:Шаблон для СТЛ контейнера

class Density { 
public: 
    template <typename Container> 
    void printStream (Container<Point>::iterator lo, Container<Point>::iterator hi); 
...... 
}; 

В файле CPP:

template <typename Container> 
void Density::printStream (Container<Point>::iterator lo, Container<Point>::iterator hi) 
{ 
... 
} 

Но получить эти ошибки при попытке компиляции:

src/../include/density.hpp:166:23: error: 'Container' is not a template 
src/../include/density.hpp:166:50: error: expected unqualified-id before 'lo' 
src/../include/density.hpp:166:50: error: expected ')' before 'lo' 
src/../include/density.hpp:166:50: error: expected initializer before 'lo' 
src/density.cpp: In member function 'void Density::startAlgorithm()': 
src/density.cpp:291:43: error: 'printStream' was not declared in this scope 
src/density.cpp: At global scope: 
src/density.cpp:327:28: error: 'Container' is not a template 
src/density.cpp:327:55: error: expected unqualified-id before 'lo' 
src/density.cpp:327:55: error: expected ')' before 'lo' 
src/density.cpp:327:55: error: expected initializer before 'lo' 

Что следует изменить? А также, почему, поскольку я хотел бы понять этот вопрос.

ответ

4

NB. Как отмечалось, вы можете не знать о последствиях использования шаблонами для видимости определений шаблонов в файлах заголовков. Позвольте мне указать вам на запись для этого: Why can templates only be implemented in the header file?


Используя шаблон аргумент шаблона:

template <template <typename...> class Container> 
void Density::printStream() 
{ 
    typename Container<Point>::iterator lo; 
    typename Container<Point>::iterator hi; 
} 

То, что вы пытаетесь сделать, мне кажется, невозможно, так как аргументы итератора не являются выводимым контекстом, поэтому вы в конечном итоге явно указываете тип контейнера в любом случае:

density_instance.printStream<std::vector>(it1, it2); 

Обратите внимание, что это не проблема, так как вы, вероятно, не заботитесь о точном типе контейнера. Идиоматический способ будет:

template <typename It> 
    void printStream (It lo, It hi); 

, которые вы свободно можете позвонить, используя

std::vector<int> v { 1,2,3 }; 
density_instance.printStream(begin(v), end(v)); 

Но и с внеклассовым контейнером, так как итераторы, что имеет значения:

const int a[] = { 1,2,3 }; 
density_instance.printStream(std::begin(a), std::end(b)); 
+0

+1 , но также есть проблема с файлом '.cpp'. – juanchopanza

+1

Действительно ли стандарт соответствует использованию '...' и предоставляет только один аргумент (т. Е. Опустить аргумент распределителя)? – celtschk

+0

@juanchopanza О, хорошая точка. Я собираюсь «исправить», ссылаясь на faq: ** [A: Почему шаблоны могут быть реализованы только в файле заголовка?] (Http://stackoverflow.com/questions/495021/why-can-templates- только-быть-реализован-in-the-header-file/495056 # 495056) ** – sehe

Смежные вопросы