我試圖為一個自定義模板類創建一個加法運算子,其中第一個引數可以是我的類的一個實體或一個基本的數字型別。 我的運算子的定義類似于下面的示例代碼:
template<typename T>
struct MyTemplateStruct {
T val;
};
template<typename T, typename U>
struct MyCommonType {
typedef std::common_type_t<T, U> type。
};
template<typename T, typename U>
using MyCommonTypeT = typename MyCommonType<T, U> ::type;
template<typename T, typename U>
MyTemplateStruct<MyCommonTypeT<T, U>> operator (
MyTemplateStruct<T> const& a, MyTemplateStruct< U> const& b)
{
return { a.val b.val };
}
template<typename T, typename U>
我的模板結構<MyCommonTypeT<T, U>> operator (
T const a, MyTemplateStruct<U> const& b)
{
return { a b.val };
}
int main()
{
MyTemplateStruct<double> a{ 0 }, b{ 0 };
a = a b。
return 0;
我的期望是,由于SFINAE,試圖用T = MyTemplateStruct<double>, U = double來實體化第二個運算子定義而導致的編譯錯誤將只是把該模板從潛在的匹配串列中排除。 然而,當我編譯時,我得到了以下錯誤:
。/usr/include/c /7/type_traits。在替換'template<class ... _Tp> using common_type_t = typename std::common_type::type [with _Tp = {MyTemplateStruct, double}]':
。
main.cpp:18:38: 需要從'struct MyCommonType<MyTemplateStruct, double>'
。 main.cpp:31:39: 被'template<class T, class U> MyTemplateStruct<typename MyCommonType<T, U>:type> operator (T, const MyTemplateStruct&) [with T = MyTemplateStruct; U = double]的替換所要求的。 main.cpp:40:13: 需要從這里開始 /usr/include/c /7/type_traits:2484:61: 錯誤: 'struct std::common_type, double>'中沒有名為'type'的型別如果我在運算子定義中直接利用
std::common_type_t,而不是使用我的包裝模板MyCommonTypeT,那么SFINAE就會像我期望的那樣作業,并且沒有錯誤。 當我必須將對std::common_type的呼叫包裹在另一個模板中時,我怎樣才能使上述代碼得到編譯呢?uj5u.com熱心網友回復:
你需要使
MyCommonTypeT<T, U>/code>(即。MyCommonType<T, U>:type)本身是無效的,當在MyCommonType中宣告type時,僅有std::common_type_t<T, U>是無效的還不夠。例如,你可以將MyCommonType專業化,當MyTemplateStruct被指定為模板引數時,type沒有被宣告。template<typename T, typename U>。 struct MyCommonType { typedef std::common_type_t<T, U> type。 }; template<typename T, typename U> struct MyCommonType<MyTemplateStruct<T> , U> {}; template<typename T, typename U> struct MyCommonType<T, MyTemplateStruct<U> > {};轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315761.html
標籤:
