编译错误传递类模板作为模板参数

  • 本文关键字:参数 错误 编译 c++ templates
  • 更新时间 :
  • 英文 :


我写的代码如下:

#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: '创建':没有找到匹配的重载函数
错误C3207: '创建':无效的模板参数'TT',类>模板将

第二个呼叫错误(在MSVC上):

错误C2672: 'create':没有找到匹配的重载函数
错误C2783: 'auto create(T)':无法推断'TT'的模板参数

我希望编译以下代码:

auto result = create(static_cast<int>(10));

create依赖于2个模板参数:TTT
因此,您想要做的一种方法是显式地提及它们:

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

上面的评论(@ songyuananyao)提到了另一种方法(推导int的方法):

auto result = create<myTemplateClass>(10);

With

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};
}

注意

注意create(std使用make_xx作为std::make_optional/std::make_pair/…)在CTAD (c++ 17)中并不真正需要,您可以这样写:

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

最新更新