Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GoogleTest PrintTo没有被调用类_C++_Googletest_One Definition Rule - Fatal编程技术网

C++ GoogleTest PrintTo没有被调用类

C++ GoogleTest PrintTo没有被调用类,c++,googletest,one-definition-rule,C++,Googletest,One Definition Rule,我在告诉googletest使用PrintTo打印特定类时遇到了一个相当奇怪的问题。 该类是一个非常简单的2D点,它位于命名空间中,PrintTo函数位于同一命名空间中。事实上,我有一个派生类(一个3D点),它可以完美地打印 下面是测试和PrintTo函数的一些代码(名称空间名称已编辑,但其他所有内容都是从实际代码复制和粘贴的): 问题是您破坏了其中一个gtest函数的OneD定义Rule() (可能是template::testing::PrintToString(const MyNamesp

我在告诉googletest使用PrintTo打印特定类时遇到了一个相当奇怪的问题。
该类是一个非常简单的2D点,它位于命名空间中,PrintTo函数位于同一命名空间中。事实上,我有一个派生类(一个3D点),它可以完美地打印

下面是测试和PrintTo函数的一些代码(名称空间名称已编辑,但其他所有内容都是从实际代码复制和粘贴的):


问题是您破坏了其中一个gtest函数的OneD定义Rule() (可能是
template::testing::PrintToString(const MyNamespace::CPunto2D&)

在使用
ASSERT\u EQ
的一个TU中,未声明
void PrintTo(const MyNamespace::CPunto2D&pto,::std::ostream*os)
, 所以
::testing::PrintToString
使用默认打印机

在另一个使用
ASSERT_EQ
的TU中,声明了
void PrintTo(const MyNamespace::CPunto2D&pto,::std::ostream*os)
,因此
::testing::PrintToString
使用自定义
PrintTo
的版本

这是同一函数的第二个不同定义


您必须确保使用
ASSERT\u EQ
的每个TU都能看到自定义
PrintTo
的声明(如
CPunto2D
的标题)。

抱歉:这些类定义在dll中,您使用的是dll中的类,但在应用程序中定义了打印方法?是的。嗯,不是在最后的应用程序中。在测试cpp中。这不应该吗?这可能是一个名字解析的问题,我不确定这是不是诚实的。我认为你在正确的轨道上。我已经把PrintTo函数移到了CPunto2D的头上,现在它可以工作了。
// PrintTo Functions
namespace MyNamespace
{
    void PrintTo(const MyNamespace::CPunto2D& pto, ::std::ostream* os)
    {
        *os << "(";
        *os << pto.X();
        *os << ",";
        *os << pto.Y();
        *os << ")";
    }

    void PrintTo(const MyNamespace::CPunto3D& pto, ::std::ostream* os)
    {
        *os << "(";
        *os << pto.X();
        *os << ",";
        *os << pto.Y();
        *os << ",";
        *os << pto.m_Z;
        *os << ")";
    }
}

// Tests
TEST(TestPrintTo, TestPunto2D)
{
    MyNamespace::CPunto2D p1(1,1);
    MyNamespace::CPunto2D pRef(5,6);

    ASSERT_THAT(p1, Eq(pRef));
}

TEST(TestPrintTo, TestPunto3D)
{
    MyNamespace::CPunto3D pCentro(1,1,1);
    MyNamespace::CPunto3D pRef(5,6,7);

    ASSERT_THAT(pCentro, Eq(pRef));
}

// Output
[ RUN      ] TestPrintTo.TestPunto2D
.\TestPuntoEje.cpp(82): error: Value of: p1
Expected: is equal to 16-byte object <00-00 00-00 00-00 14-40 00-00 00-00 00-00 18-40>
  Actual: 16-byte object <00-00 00-00 00-00 F0-3F 00-00 00-00 00-00 F0-3F> (of type class MyNamespace::CPunto2D)
[  FAILED  ] TestPrintTo.TestPunto2D (1 ms)
[ RUN      ] TestPrintTo.TestPunto3D
.\TestPuntoEje.cpp(90): error: Value of: pCentro
Expected: is equal to (5,6,7)
  Actual: (1,1,1) (of type class MyNamespace::CPunto3D)
[  FAILED  ] TestPrintTo.TestPunto3D (0 ms)
namespace MyNamespace
{
    class CLAS_DEC CPunto2D
    {
    public:
        double m_X;
        double X() const { return m_X; }
        void X(double val) { m_X = val; }
        double m_Y;
        double Y() const { return m_Y; }
        void Y(double val) { m_Y = val; }
        //Constructores/Destructores
        CPunto2D();
        CPunto2D(double X, double Y);
        CPunto2D(const CPunto2D& P);
        ~CPunto2D();

        CPunto2D& Set(double X, double Y);

        //Operadores
        CPunto2D& operator =(const CPunto2D& P);

        //Funciones extra
        double Distancia (const CPunto2D& P) const;  //Distancia a otro punto
    };
    bool CLAS_DEC operator==(const CPunto2D& lhs, const CPunto2D& rhs);
    bool CLAS_DEC operator!=(const CPunto2D& lhs, const CPunto2D& rhs);
}

namespace MyNamespace
{
    class CLAS_DEC CPunto3D : public CPunto2D
    {
    public:
        double m_Z;

        // Constructores/Destructores
        CPunto3D();
        CPunto3D(double X, double Y, double Z);
        CPunto3D(const CPunto3D& P);
        CPunto3D(const CPunto2D& P);
        ~CPunto3D();

        CPunto3D& Set(double X, double Y, double Z);

        // Operadores
        CPunto3D& operator =(const CPunto3D& P);
        bool operator==(const CPunto3D& P) const;
        bool operator!=(const CPunto3D& P) const;

        // Funciones Extra
        double Distancia (const CPunto3D& P) const;  //Distancia a otro punto
        double Distancia2D (const CPunto2D& P) const;  //Distancia en el plano a otro punto
    };
}