使用std :: cout时对类的未定义引用

时间:2018-04-17 14:55:29

标签: c++ c++11

考虑以下代码:

rgb.h

namespace Company{
namespace Core{
constexpr int RGB_MIN = 0;
constexpr int RGB_MAX = 255;

template<typename T>
class RGB;

using RGBi = RGB<int>;

template<typename T>
class RGB
{
public:
   constexpr RGB() : R(0), G(0), B(0)
   {
   }

   constexpr RGB(T red, T green, T blue) : R(red), G(green), B(blue)
   {
   }

   static constexpr RGB<T> Red   = RGB<int>(RGB_MAX,RGB_MIN,RGB_MIN);
   static constexpr RGB<T> Green  = RGB<int>(RGB_MIN,RGB_MAX,RGB_MIN);
   static constexpr RGB<T> Blue = RGB<int>(RGB_MIN,RGB_MIN,RGB_MAX);

   operator std::string() const
   {
      std::ostringstream s;
      s << "RGB=" << R << "," << G << "," << B;
      return s.str();
   }
   T R, G, B;
};

template<class T>
std::ostream& operator<<(std::ostream & os, const RGB<T>& rgb)
{
    return os << rgb;
}

}
}

qt_addons.h

#include <QDebug>
QDebug operator <<(QDebug debug, const std::string& object)
{
   debug << QString::fromStdString(object);

   return debug;
}

的main.cpp

#include <iostream>
#include "qt_addons.h"
#include "rgb.h"
int main()
{
   using namespace Company::Core;

   qDebug() << RGBi::Blue;

   return 0;
}

一切都很完美,但如果我尝试使用std :: cout而不是qDebug,它会给我一个

  

&#39;对Company :: Core :: RGB :: Blue&#39;

的未定义引用

如果我尝试初始化一个普通变量,它仍然适用于qDdebug(),但它会转到std :: cout的分段错误。

我错过了什么?

已解决

有两个问题:声明静态变量和运算符&lt;&lt;方法。这解决了这个问题。

operator std::string() const
   {
      return toString();
   }

   std::string toString() const
   {
      std::ostringstream s;
      s << "RGB=" << R << "," << G << "," << B;
      return s.str();
   }

和外面:

template<typename T>
constexpr RGB<T> RGB<T>::Red;

template<typename T>
constexpr RGB<T> RGB<T>::Green;

template<typename T>
constexpr RGB<T> RGB<T>::Blue;

template<class T>
std::ostream& operator<<(std::ostream & os, const RGB<T>& rgb)
{
    return os << rgb.toString();
}

0 个答案:

没有答案