У меня есть следующий класс:
#pragma once
#include <string>
#include <iostream>
class testclass
{
public:
template <class T> T item(const std::string& key)
{
std::cout << "non-specialized\n";
return T();
}
};
Для метода item я хотел бы указать специализацию для строк. Я пытаюсь сделать это следующим образом (в testclass.cpp):
#include "testclass.h"
#include <iostream>
template<> std::string testclass::item(const std::string& key)
{
std::cout << "specialized\n";
return std::reverse(key.begin(), key.end());
}
А потом я пытаюсь вызвать функцию следующим образом:
#include <iostream>
#include "testclass.h"
int main()
{
testclass t;
std::string key = "foo";
t.item<int>(key);
std::string s = t.item<std::string>(key);
std::cout << s << std::endl;
}
Однако на выходе получается
$ ./a.out
non-specialized
non-specialized
(empty line)
То, что я исключил, было
$ ./a.out
non-specialized
specialized
oof
Как я могу сделать это правильно? Я использую g ++ 4.5.2 для компиляции программы.
Редактировать
Решением является перемещение всего определения специализации item
в testclass.h (но не в класс). У меня были другие ошибки в программе, например, не включая <algorithm>
(для реверса), и неправильно думал, что он вернет обратную строку Чтобы добиться исключительного поведения, файл .cpp оставляют пустым, а содержимое заголовка:
#pragma once
#include <string>
#include <iostream>
#include <algorithm>
class testclass
{
public:
template <class T> T item(const std::string& key)
{
std::cout << "non-specialized\n";
return T();
}
};
template<> std::string testclass::item(const std::string& key)
{
std::cout << "specialized\n";
std::string s = key;
std::reverse(s.begin(), s.end());
return s;
}