0

基本クラスを持つクラス テンプレートの実装があります。

class MyBase
{
protected:
    virtual void getErrorPercent(std::ostream& fileStream) = 0;
    virtual void getFormattedText(std::ostream& fileStream) = 0;
};

template <class T>
class MyClass : public MyBase
{
protected:
    void getErrorPercent(std::ostream& fileStream) override
    void getFormattedText(std::ostream& fileStream) override
private:
    std::string getErrorPercentageStr();
    T m_expected;
    T m_measured;
};

cpp [クラス内から移動]:

template <class T>
std::string MyClass<T>::getErrorPercentageStr()
{
    return "";
}

template <class T>
void MyClass<T>::getErrorPercent(std::ostream& fileStream)
{
    // Default for any type is to do nothing
}

template <class T>
void MyClass<T>::getFormattedText(std::ostream& fileStream)
{
    fileStream << "Measured " << m_measured << ", Expected " << m_expected;
}

getErrorPercent、getFotmattedText、および double 型のみの getErrorPercentageStr の関数テンプレートの特殊化を追加したいと考えています。

getErrorPercent の場合:

template<>
void MyClass<double>::getErrorPercent(std::ostream& fileStream)
{
   fileStream << " Error " << getErrorPercentageStr() << std::endl;
}

getFotmattedText の場合:

template<>
void MyClass<double>::getFormattedText(std::ostream& fileStream)
{
   fileStream << "Measured " << m_measured << ", Expected " << m_expected
       << " [Error " << getErrorPercentageStr() << "]";
}

double の getErrorPercentageStr 関数は、誤差 [m_measured と m_expected は double になります] を計算し、文字列として返します。他のすべてのタイプでは、空の文字列が返されます。

template<>
std::string MyClass<double>::getErrorPercentageStr();
{
    std::ostringstream rep;
    double difference = m_measured - m_expected;
    if (m_expected == 0.0)
    {
        rep << difference << "V";
    }
    else
    {
        double error = (difference / m_expected) * 100.0;
        if (std::abs(error) < 100.0)
        {
            rep << error << "%";
        }
        else
        {
            rep << difference << "V";
        }
    }
    return rep.str();
}

私は解決策を探していましたが、ダブルの正しい関数をコンパイルまたは呼び出すことができません。

関数の特別なバージョンをどこにどのように置くのですか? これらをクラス自体に入れることはできないと思います。

hまたはcppファイルで?

関数の主な実装 [非特殊化] をクラスに残すことはできますか?

特殊な関数のプロトタイプをどこかに配置する必要がありますか?

template<> std::string MyClass<double>::getErrorPercentageStr();
template<> void MyClass<double>::getErrorPercent(std::ostream& fileStream);
template<> void MyClass<double>::getFormattedText(std::ostream& fileStream);

そして、cppで実装しますか?

これを試してみたところ、MyClass::getFormattedText() および MyClass::getErrorPercent() の int バージョンの「未解決の外部シンボル」が大量に取得されました。bool、unsigned int、および std::basic_string バージョンについても同様です。これらはすべてデフォルト バージョンを使用する必要があります。

これらを修正するにはどうすればよいですか?

「if constexpr (std::is_same_v<T, double>)」で処理するようにしましたが、vxWorks でコンパイルできませんでした。<< for double in getErrorPercentageStr where "rep << difference << "V";".

エラー: 'operator<<' に一致しません (オペランドの型は 'std::ostringstream' と 'double' です)

どんな助けでも大歓迎です!

4

0 に答える 0