我正在尝试定义一个对类型有一些操作的模板类。 应该实现ToString方法,以调用Tools模板类已经实例化的任何类型的命名空间中的ToString。
namespace X
{
class SomeType
{
};
std::wstring ToString(SomeType)
{
// ...
}
}
template<class T>
class Tools
{
static auto ToString(T& t)
{
return ToString(t);
}
}
我在ToString的Tools实现中遇到错误。编译器尝试再次递归调用方法ToString,而不是调用命名空间X中的ToString。
我不能使用X :: ToString,因为当我尝试使用来自命名空间Y的类型实例化Tools类时,它会失败。例如,如果我使用:
namespace Y
{
class SomeOtherType
{
};
std::wstring ToString(SomeOtherType)
{
// ...
}
}
Y::SomeOtherType someOtherType;
auto s = Tools<Y::SomeOtherType>::ToString(someOtherType); // Would fail as SomeOtherType isn't in namespace X.
是否可以使这项工作?
我正在使用VS 2015 Update 3.首选的解决方案。
相关:calling a global function with a class method with the same declaration
答案 0 :(得分:4)
明确使用
return ::X::ToString(t);
引用X
命名空间中的函数,而不管引用来自哪个命名空间。
答案 1 :(得分:3)
好的,我可能有一个解决方案。使用不同的名称添加一个在类外部的中间函数,然后使用正确的名称调用。
添加
namespace ImplementationDetail
{
template< class T >
auto ToStringHelper(T& t)
{
return ToString(t);
}
}
template<class T>
class Tools
{
auto ToString(T& t)
{
return ImplementationDetail::ToStringHelper(t);
}
}