C++ 命名空间冲突的类型参数化测试

C++ 命名空间冲突的类型参数化测试,c++,googletest,type-parameter,C++,Googletest,Type Parameter,我的代码结构如下: namespace A{ class baseClass{ template<typename t> static ::boost::shared_ptr<t> create_obj(); }; } namespace A{ namespace B{ class DerivedClass1 : public baseClass { void create_obj(){...}; } } } namespace A{ n

我的代码结构如下:

namespace A{
class baseClass{
 template<typename t> static ::boost::shared_ptr<t> create_obj();
};
}

namespace A{
 namespace B{
   class DerivedClass1 : public baseClass {
     void create_obj(){...};
   }
 }
}

namespace A{
 namespace C{
   class DerivedClass2 : public baseClass {
     void create_obj(){...};
   }
 }
}
名称空间A{
类基类{
模板static::boost::shared_ptr create_obj();
};
}
名称空间A{
命名空间B{
类DerivedClass1:公共基类{
void create_obj(){…};
}
}
}
名称空间A{
命名空间C{
类DerivedClass2:公共基类{
void create_obj(){…};
}
}
}
有一个基类和大约5-6个派生类,它们都在不同的名称空间中。我正在尝试使用google测试框架为create_obj()编写一个测试,使用类型参数化测试,因为该方法需要对所有派生类进行测试。我的测试代码是:

#include "gtest/gtest.h"
#include "baseClass.h"
#include "DerivedClass1.h"
#include "DerivedClass2.h"

using namespace A;
using namespace B;
using namespace C;

template<typename T> class sample_test : public ::testing::Test 
{
protected:
  boost::shared_ptr<TypeParam> = create_obj();
};

TYPED_TEST_CASE_P(sample_test);

TYPED_TEST_P(sample_test, firstTest)
{
  //do some testing
}

REGISTER_TYPED_TEST_CASE_P(sample_test, firstTest);
typedef ::testing::Types<DerivedClass1, DerivedClass2> tTypes;
INSTANTIATE_TYPED_TEST_CASE_P(mytest, sample_test, tTypes);
#包括“gtest/gtest.h”
#包括“baseClass.h”
#包括“DerivedClass1.h”
#包括“DerivedClass2.h”
使用名称空间A;
使用名称空间B;
使用名称空间C;
模板类示例_测试:public::testing::test
{
受保护的:
boost::shared_ptr=create_obj();
};
型式试验(样本试验);
类型化测试(样本测试、首次测试)
{
//做一些测试
}
注册类型测试案例(样本测试,首次测试);
typedef::testing::Types tTypes;
实例化类型化测试案例(mytest,sample,tTypes);
这段代码给出了一些模板错误,因为它不知道要调用哪个create_obj()

所以我试图在测试中编写一个switch case或if-else场景,它将从正确的名称空间调用方法。差不多

  template<typename T> class sample_test : public ::testing::Test 
    {
    protected:
      switch(T)
      {
        case DerivedClass1:
          //Call method like  A::B::create_obj()
        case DerivedClass2:
          //Call method like  A::C::create_obj()
     }
    };
模板类示例\u测试:public::testing::test
{
受保护的:
开关(T)
{
案件类别1:
//像A::B::create_obj()那样调用方法
案例2:
//像::C::create_obj()那样调用方法
}
};
但我显然不能在switch情况下,甚至在if-else schenario中,将T作为参数。有没有办法做到这一点


非常抱歉,我不能在网上发布代码。我希望这就足够了。

根据您发布的代码判断,您可以通过在注册类型时直接指定名称空间来修复测试代码,如下所示:

typedef ::testing::Types<A::B::DerivedClass1, A::C::DerivedClass2> tTypes;

typedef::testing::Types

我不知道为什么,但是std::和boost::都不一样。两者都给出了编译错误“语法错误:if语句”。但最终起作用的是@Ulrich Eckhardt建议的以下代码

template<typename T> class sample_test : public ::testing::Test 
{
protected:
  boost::shared_ptr<T> testObj;
  testObject = T::create_obj();
};
模板类示例\u测试:public::testing::test
{
受保护的:
boost::shared_ptr testObj;
testObject=T::create_obj();
};

您不必将整个代码发布到网上(通常也不应该发布),但仍应提取MCVE。顺便说一下:考虑<代码> t::CREATIONObjor()/<代码>。请提供一些反馈。答案有用吗?我没有c++11,所以“std::is_same”不起作用。有什么类似的东西我可以用吗?@Preeti Well
是一样的
实际上也在boost中,所以你很好:
template<typename T> class sample_test : public ::testing::Test 
{
protected:
  boost::shared_ptr<T> testObj;
  testObject = T::create_obj();
};