0

変換する 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();
}

しかし、これはこのファイルをコンパイルすることさえできず、テンプレートについて何も知らないと感じさせてくれるので、ここに来ました。このトピックに関するアーロンの回答を読みました: 「未定義の参照」テンプレート クラス コンストラクター。その後、私は多くのことを理解しました。しかし、どうすれば関数を事前定義できますか?

4

2 に答える 2

0

あなたが言及したトピックにある答えの簡単な説明をします:この問題には2つの方法があります:

  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 に答える
0

テンプレートは実際のコードではなく、すべてのテンプレート パラメーターが入力された後にコードを構築するための指示です。これを行うには、テンプレート関数が使用される時点で、コンパイラーが完全なテンプレート定義を持っている必要があります。テンプレート化されたコードにヘッダー ファイルからアクセスできるようにする必要があります。

于 2012-06-05T14:49:08.417 に答える