2016-09-17 20 views
0

具有相同名稱的調用函數我試圖定義一個在類型上有一些操作的模板類。 應該實現方法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的工具實現中遇到錯誤。編譯器試圖再次遞歸地調用方法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更新3.爲此工作的解決方案是首選。

相關:calling a global function with a class method with the same declaration

+1

我不明白爲什麼'X :: ToString()'不起作用,你能提供一個你的意思嗎? – Galik

+1

@Galik:他意味着他想要'namespaceof(T):: ToString()'。即它也可以是'Y :: ToString()'或'Z :: ToString()'或別的東西。所以只要寫'X :: ToString()'是不對的。 –

+0

如果我理解正確(不確定),似乎你希望'X :: ToString();'能夠用不同的參數類型('X :: SomeType'&'Y :: SomeType')來調用。爲此,您需要將其設置爲模板功能。 – Galik

回答

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); 
    } 
} 
+0

這似乎是合理的。順便說一句,這是我不贊成「使一切成爲自由功能」宗教的原因之一;這裏'T'的成員函數會非常簡單明瞭。 –

+0

@LightnessRacesinOrbit。是的我同意。我忘了解釋T類型實際上是我不能添加方法的枚舉。 –

+0

好東西然後:) –

2

明確使用

return ::X::ToString(t); 

引用功能在X命名空間,不論其命名空間中的參考來自。

+1

嗯,是的,但調用X命名空間中的函數,而不管它在哪個名稱空間中,當函數位於Y命名空間中時,用處不大。 –