2015-04-04 4 views
-1

Я написал класс, который имеет шаблонную функцию-член, в основном потому, что в качестве аргумента требуется std::vector, однако я изо всех сил пытаюсь найти правильный способ его вызова.Вызов шаблонного члена класса

class foo(){ 
    // ... 
    template <typename _t> int bar(const std::vector<_t> *values); 
    // ... 
} 

при вызове этой функции позже:

// ... 
foo c; 
std::vector<int> v(5,100); 
c.bar(&v); 
// ... 

Я получаю ошибку:

error: no matching function for call to ‘foo::bar(std::vector<int>*)’ 
c.bar(&v); 

не должны foo::bar(std::vector<int>*) соответствовать параметрам шаблона? Почему он не компилируется?

+2

После того, как несущественные части кода правовой, [не может воспроизводить] (HTTP: //coliru.stacked-crooked.com/a/c60537785a9849ee). – chris

+0

Вы внедрили тело метода в любом месте своего заголовочного файла? –

+0

@WojciechFrohmberg, это все равно будет компилироваться, просто не ссылка (как в моей попытке воспроизведения). – chris

ответ

1

Рабочий пример:

#include <vector> 

class foo{ 
public: 
     template <typename _t> int bar(const std::vector<_t> *values) { 
      return 1; 
     } 

}; 


int main() { 
    foo c; 
    std::vector<int> v(5,100); 
    c.bar(&v); 
} 

Если вам действительно нужно, чтобы не быть инлайн вы можете:

//from here 
#include <vector> 

class foo{ 
public: 
     template <typename _t> int bar(const std::vector<_t> *values); 

}; 

template <typename _t> int foo::bar(const std::vector<_t> *values) { 
    return 0; 
} 
//to here - should be in header file to allow compiler to link it! 

int main() { 
    foo c; 
    std::vector<int> v(5,100); 
    c.bar(&v); 
} 
+0

Я получаю 'undefined ссылку на' int foo :: bar (std :: vector > const *) ''при компиляции этого. – joaocandre

+0

@joaocandre какой компилятор вы используете? –

+0

Он компилируется под g ++, clang также не жалуется: http://coliru.stacked-crooked.com/a/e70801ee26538dfc Я также проверяю онлайн-компилятор визуальной студии, и он говорит только об ошибке, которая возвращает foo :: bar значение. .. (редактирование кода) –