我有一个带有基类的类模板的实现。
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')
任何帮助将不胜感激!