调用与方法

时间:2016-09-17 21:25:06

标签: c++ templates namespaces

我正在尝试定义一个对类型有一些操作的模板类。 应该实现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

2 个答案:

答案 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);
    }
}