c++ 将类模板作为模板参数传递时出现编译错误

nnt7mjpx  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(147)

我写的代码如下:

#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));
gk7wooem

gk7wooem1#

create取决于2个模板参数:TTT
因此,一种方法就是明确地提到它们:

//-------------------vvvvvvvvvvvvvvv--vvv-----
auto result = create<myTemplateClass, int>(10);

在上面的评论(作者@songyuanyao)中提到了一种替代方式(其中int被推导出来):

auto result = create<myTemplateClass>(10);
yeotifhr

yeotifhr2#

template <template<typename> class TT, typename T>
auto create(T val)
requires std::is_same_v<TT<T>, myTemplateClass<T>>;

应该这么说

create<myTemplateClass>(42);
create<myTemplateClass, int>(42);
允许
auto result =  create<myTemplateClass<int>>(10);

您需要:

template <typename TT, typename T>
auto create(T val)
requires std::is_same_v<TT, myTemplateClass<T>>
{
    return {val};
}
允许
auto result =  create(10); // myTemplateClass<int>

您需要:

template <typename T>
auto create(T val) -> myTemplateClass<T>
{
    return {val};
}
备注

请注意,CTAD(C++17)并不真正需要create(std使用make_xx作为std::make_optional/std::make_pair/...),您可以编写:

auto result =  myTemplateClass(10); // myTemplateClass<int>

相关问题