c++嵌套SFINAE模板导致编译错误



我试图为自定义模板类创建一个加法运算符,其中第一个参数允许是我的类的实例或基本数字类型。我的操作符的定义类似于下面的示例代码:

#include <type_traits>
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>
MyTemplateStruct<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: In substitute ' template<class…_Tp>使用common_type_t = typename std::common_type::type [with _Tp = {MyTemplateStruct, double}] ':
main.cpp:18:38:需要从' struct MyCommonType<MyTemplateStruct,> '
main.cpp:31:39:需要通过替换' templateMyTemplateStruct

您需要使MyCommonTypeT<T, U>(即MyCommonType<T, U>::type)本身无效,在MyCommonType中声明typestd::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>> {};

生活

相关内容

  • 没有找到相关文章