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 和 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 and m_expected will be doubles] 并将其作为字符串返回。对于所有其他类型,它将返回一个空字符串。

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

我一直在寻找解决方案,但无法编译或调用正确的 double 函数。

我如何/在哪里放置函数的专用版本?我不认为我可以把这些放在课堂上。

在 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