我在cpp中写了一个StringHelper来转换。但如果我将sourceode放在外部cpp文件(包含在Codeblocks-projectfile中)或者我不理解错误,它将无法编译:
HPP:
#ifndef _INPUT_STRINGHELPER_HPP
#define _INPUT_STRINGHELPER_HPP
#include <string>
#include <sstream>
#include <deque>
namespace FiveDimension
{
void SplitStream(std::stringstream& s, char c, std::deque<std::string>& ret);
void SplitString(std::string s, char c, std::deque<std::string>& ret);
template<typename T> T StringToAll(std::string val);
template<typename T> bool TryStringToAll(std::string val, T &ret);
template<typename T> std::string AllToString(T val);
}
#endif
CPP:
#include "StringHelper.hpp"
void FiveDimension::SplitStream(std::stringstream& s, char c, std::deque<std::string>& ret)
{
std::string line;
while(std::getline(s, line, c))
ret.push_back(line);
}
void FiveDimension::SplitString(std::string s, char c, std::deque<std::string>& ret)
{
std::string line;
std::stringstream ss(s);
while(std::getline(ss, line, c))
ret.push_back(line);
}
template<typename T> T FiveDimension::StringToAll(std::string val)
{
std::stringstream s(val);
T ret;
s >> ret;
return ret;
}
template<typename T> bool FiveDimension::TryStringToAll(std::string val, T &ret)
{
std::stringstream s(val);
return (s >> ret);
}
template<typename T> std::string FiveDimension::AllToString(T val)
{
std::stringstream s;
s << val;
return s.str();
}
我也试过例如:
template<typename T> std::string FiveDimension::AllToString<T>(T val)
{
std::stringstream s;
s << val;
return s.str();
}
但是这甚至没有编译这个文件,让我觉得我对模板一无所知所以我来到这里。 我读了亚伦关于这个主题的答案:"Undefined reference to" template class constructor。之后我了解了很多。但是我怎样才能预定义函数?
答案 0 :(得分:0)
模板不是实际代码,它是在填写所有模板参数后构建代码的说明。为此,编译器必须在使用模板函数的位置具有完整的模板定义。您必须从头文件中访问模板化代码。
答案 1 :(得分:0)
我将简要回答一下,在主题中,您已经提到: 这个问题有两种解决方法:
对于模板类,您应该使用以下代码:
template class your_class_name < typename_to_use >;
其中typename_to_use类似于int,std :: string或else。 对于模板函数,您应该使用以下代码:
template return_type your_function_name<typename_to_use>(...parameters);
对于模板成员函数,您应该使用以下代码:
template return_type your_class_name::your_function_name<typename_to_use>(...parameters);
或
template return_type your_class_name<class_typename_to_use>::your_function_name<function_typename_to_use>(...parameters);
最后一种情况是描述模板类使用模板函数时的情况。