0

我在 cpp 中给自己写了一个 StringHelper 来进行转换。但是如果我将 sourceode 放在外部 cpp 文件(包含在 Codeblocks-projectfile 中)或者我不理解错误,它将无法编译:

高压钠灯:

#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

共产党:

#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();
}

但这甚至没有编译这个文件,让我觉得我对模板一无所知,所以我来到了这里。我阅读了 Aaron 关于这个主题的答案:“未定义的引用”模板类构造函数。之后我明白了很多。但是我怎样才能预定义一个函数呢?

4

2 回答 2

0

模板不是实际代码,它是在填写完所有模板参数后构建代码的指令。为此,编译器必须在使用模板函数时具有完整的模板定义。您必须使模板化代码可从头文件访问。

于 2012-06-05T14:49:08.417 回答
0

我会做一个简短的答案,那就是在你提到的主题中:有两种方法可以解决这个问题:

  1. 使用内联(我知道,你不想这样做,但它是更通用和正确的方法)。
  2. 使用您将在 .cpp 文件中使用的类型的定义。

对于模板类,您应该使用以下代码:

template class your_class_name < typename_to_use >;

其中 typename_to_use 类似于 int、std::string 或其他。对于模板函数,您应该使用以下代码:

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);

最后一种情况是描述模板类使用模板函数的情况。

于 2012-06-05T14:55:49.893 回答