我有一個模板類,看起來像這樣內:C++ - 使用帶有枚舉decltype包含一個模板類
template <typename T>
class Foo {
public:
enum Mode { Mode1, Mode2, Mode3 };
// ...
};
我實例是:
Foo<float> foo;
// ...
auto m = Foo<float>::Mode1;
但在我看來,一個不必要的冗餘以在實例化Foo模板時使用的類型中包含源依賴項。傳統的解決方案將是對整個類型typedef
:
typedef Foo<float> FooType;
FooType foo;
// ...
auto m = FooType::Mode1;
但在我看來,編譯器應該能夠推導與實際實例變量的類型。所以這樣的代替:
Foo<float> foo;
// ...
typedef decltype(foo) FooType;
auto m = FooType::Mode1;
這編譯。令我百思不解的是,爲什麼我不能做的最後一部分作爲一個單一的表達:
auto m = typename decltype(foo)::Mode1;
這將導致「預期‘(’爲函數樣式轉換或類型建設」的編譯器錯誤
原因爲什麼我要這樣做呢是因爲我的模板參數比T
多得多,而頂層typedef可能是最明智的解決方案,我想知道爲什麼我在單行上使用decltype時沒有工作
我使用鏗鏘3.0,我不能使用-std = C++ 11,所以我只使用默認的C++ fe在鏗鏘3.0的氛圍中。不幸的是我不能在這個版本中使用枚舉類。
'decltype' * *是一個C++ 11的功能,所以是用auto'的'。 – ghostofstandardspast
@ghostofstandardspast是的,我可以訪問Clang 3.0中的默認C++功能,其中包括一些C++ 11功能,如'auto'和'decltype'。我只是無法打開'-std = C++ 11',因爲這是一個禁用了此選項的自定義第三方Clang版本。 – meowsqueak
這似乎很混亂。在我看來,它應該默認爲具有編譯器所具有的所有功能的C++ 11,或者默認爲不具有C++ 11功能的舊標準,除非您有選項。 – ghostofstandardspast