我写的代码如下:
#include <type_traits>
template <typename T>
class myTemplateClass
{
public:
myTemplateClass(T t)
: val{t}
{}
T val;
};
template <template<typename> class TT, typename T>
auto create(T val)
requires std::is_same_v<TT<T>, myTemplateClass<T>>
{
return TT<T>(val);
};
int main()
{
auto result = create<myTemplateClass<int>>(10);
// or
auto result = create(static_cast<int>(10));
}
但是两个create
函数调用都无法构建。
第一次调用时出错(在MSVC上):
错误C2672:“create”:未找到匹配的重载函数
错误C3207:“create”:“TT”的模板参数无效,应为class〉template
第二次调用时出错(在MSVC上):
错误C2672:“create”:未找到匹配的重载函数
错误C2783:'自动创建(T)':无法推导“TT”的模板参数
我希望编译以下代码:
auto result = create(static_cast<int>(10));
2条答案
按热度按时间gk7wooem1#
create
取决于2个模板参数:TT
和T
。因此,一种方法就是明确地提到它们:
在上面的评论(作者@songyuanyao)中提到了一种替代方式(其中
int
被推导出来):yeotifhr2#
与
应该这么说
允许
您需要:
允许
您需要:
备注
请注意,CTAD(C++17)并不真正需要
create
(std使用make_xx
作为std::make_optional
/std::make_pair
/...),您可以编写: