我有一個相當於std::integer_sequence
(我們還沒有使用C++ 14)。我也有兩個助手類,刪除或添加一個前導號碼。g ++中的變量模板部分特化「不是更專業化」7.1.1
// Sequence type
template <typename Type, Type ... Values>
struct Sequence
{
using value_type = Type;
};
// Pop a value off of the start of a sequence
template <class Class>
struct SequencePop;
template <typename Type, Type Value, Type ... Values>
struct SequencePop<Sequence<Type, Value, Values ...>>
{
using type = Sequence<Type, Values ...>;
};
// Push a value on to the start of a sequence
template <class Class, typename Class::value_type Value>
struct SequencePush;
template <typename Type, Type Value, Type ... Values>
struct SequencePush<Sequence<Type, Values ...>, Value>
{
using type = Sequence<Type, Value, Values ...>;
};
SequencePop
被認爲是在所有的編譯器有效我曾嘗試(克++ 6.4.1,克++ 7.1.1,鐺++ 4.0.1)。 SequencePush
不能用g ++ 7.1.1編譯。錯誤消息如下。
test.cpp:24:8: error: partial specialization ‘struct SequencePush<Sequence<Type, Values ...>, Value>’ is not more specialized than [-fpermissive]
struct SequencePush<Sequence<Type, Values ...>, Value>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:21:8: note: primary template ‘template<class Class, typename Class::value_type Value> struct SequencePush’
struct SequencePush;
爲G ++ 7.1.1正確的拒絕這個代碼,如果是這樣,一個人如何告訴SequencePush
是不是比主模板「更專業化」?
雖然這個作品,我不知道爲什麼OP的原代碼將無法編譯。至少部分專業化應該更專業一些,因爲它包含一個'Sequence'模板模板類。我錯過了什麼? – Curious
這比我的嘗試要好得多:) – YSC
@Curious:不確定正確的措辭,但是'Type'沒有比'Class :: value_type'更專門化(即使它被'Sequence'約束)。 – Jarod42