2016-05-05 103 views
-1

這似乎是一個Visual Studio問題。此代碼runs fine in gcc但未能在Visual Studio編譯:爲什麼我無法從decltype返回的value_type獲取bool值?

#include <iostream> 
#include <type_traits> 
#include <typeinfo> 

using namespace std; 

true_type foo(); 

template <typename T> 
struct bar{ 
    using def = conditional_t<decltype(foo())::value, char, void>; 
}; 

int main() { 
    cout << typeid(bar<int>::def).name() << endl; 

    cout << decltype(foo())::value << endl; 
} 

給出的錯誤是:

syntax error: missing '>' before identifier 'value'

您可以在線測試:http://webcompiler.cloudapp.net/

是否有這個或錯誤修復解決方法嗎?

+0

你使用什麼編譯器? (似乎工作[海灣合作委員會6.1](http://coliru.stacked-crooked.com/a/69fbf1c430cf3e1a)) – milleniumbug

+0

@milleniumbug不幸的是我在Visual Studio上似乎有一個錯誤:( –

+0

@NathanOliver我'這是不是一個印刷錯誤,請重新打開。 –

回答

1

我不知道,如果它可以幫助你,但我能夠解決這樣的問題:

首先定義:

template <typename I> using id = I; 

然後用

取代 decltype(foo())::value每個實例
id<decltype(foo())>::value 

或者,你可以使用std::common_type_t以同樣的方式:

std::common_type_t<foo()>::value 

或者說,我的精神力量預測你可能只是想定義一個單獨的類型decltype<foo()>,爲了方便:

using id = decltype(foo());

然後用id::value取代的decltype(foo())::value所有實例。

2

在你的問題你使用decltype(foo())

using def = conditional_t<decltype(foo())::value, char, void>; 
            ^^^^^ 

同時Ideone,decltype(foo)

using def = conditional_t<decltype(foo)::value, char, void>; 
            ^^^^^ 

他們是不同的東西。在第一種情況下,您將獲得調用foo的結果的類型。在第二個中,您將獲得函數


好吧,從那時起事情就發生了巨大的變化。

該代碼被編輯,並應該編譯好,但與Visual Studio編譯失敗,而鏗鏘是非常高興與此代碼,並沒有顯示任何錯誤,甚至警告。

因此,鑑於鐺(最新版本,使用--std=c++14 -Wall -Wextra)發現此代碼正確,我相信這應該是VS中的一個錯誤。

+0

我編輯過,這不是印刷錯誤,請重新打開。 –

+0

@JonathanMee,使用C++ 14標準編譯得很好。雖然我不知道如何在VS中更改標準... – ForceBru

+0

您是否嘗試過我在Visual Studio 2015上發佈的代碼?我發佈了一個鏈接到微軟的Web編譯器。它*不*編譯得很好。 –

相關問題