2013-04-17 50 views
1

以下代碼適用於gcc甚至VC11 Nov CTP,但無法使用VC11 RTM進行編譯。VS2012 - Decltype作爲尾隨返回類型中的模板參數

template<typename T> 
struct A { 
    typedef typename T::Type BreakMe; 
    T x; 
}; 
struct B { typedef int Type; }; 

template<typename T> 
struct C { 
    static A<T> f(A<T> a) { 
     return A<decltype(a.x)>(); 
    } 
    static auto g(A<T> a) -> A<decltype(a.x)> { 
     return A<decltype(a.x)>(); 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    C<B>::f(A<B>()); 
    C<B>::g(A<B>()); 
    return 0; 
} 

VC11 RTM似乎會失敗decltype傳遞作爲一個返回值的模板參數:它認爲「T =未知」。請注意,f編譯良好,儘管在其中使用了decltype。

這是RTM中的編譯器錯誤嗎?如果是這樣,是否有解決方法?

回答

2

我找到了解決方法。

訣竅是將整個返回類型傳遞給輔助結構,並強制模板在那裏解析。 typedef -ing助手struct中的返回類型似乎不夠,因爲decltyped模板參數仍然看起來是未知的。但是,將其設置爲輔助結構中函數的返回類型似乎會強制類型被解析。然後,您可以簡單地獲取該函數的返回類型(再次使用decltype)。

的解決辦法宏結束語這件事給

#if defined(_MSC_VER) && _MSC_VER <= 1700 
namespace workarounds { 
    template<typename T> 
    struct resolve_template { 
    static T ret(); 
    }; 
} 
#define RESOLVE_TEMPLATE(A) decltype(::workarounds::resolve_template<A>::ret()) 
#else 
#define RESOLVE_TEMPLATE(A) A 
#endif 

添加這上面給出:http://rise4fun.com/Vcpp/JplI