模板参数 deduction/substitution 失败 std::set
Template argument deduction/substitution failed with std::set
我浏览了很多出现相同错误的帖子,但找不到适用于我的问题的帖子,无论如何,如果这是重复的,我深表歉意。
无论如何,我的任务是制作一个名为 set_helper 的 class,它使 std::sets 更易于使用。
set_helper 将一个集合作为其构造函数参数,为了帮助进行模板类型推导,我还必须制作一个名为 make_set_helper 的函数,该函数应该可以使类型推导更容易。我不完全明白那是什么意思,所以这是我试过的。
MRE 与 main.cpp
和 sethelp.h
main.cpp
#include<set>
#include "sethelp.h"
int main()
{
std::set<int, std::greater<int> > sg;
sg.insert( 0 );
sg.insert( 1 );
make_set_helper( sg );
return 0;
}
sethelp.h
#pragma once
template<class T>
class set_helper
{
private:
std::set<T>* s;
public:
set_helper(std::set<T>& s) { this->s = &s; }
bool operator==(T other) { return this == other; }
std::set<T>* get_set() {return this->s;}
};
template<class T>
set_helper<T> make_set_helper(std::set<T>& s)
{
return set_helper(s);
}
这是错误信息
error: no matching function for call to ‘make_set_helper(std::set<int, std::greater<int> >&)’
108 | make_set_helper( sg ) += sih;
note: candidate: ‘template<class T> set_helper<T> make_set_helper(std::set<T>&)’
79 | set_helper<T> make_set_helper(std::set<T>& s)
note: template argument deduction/substitution failed:
note: mismatched types ‘std::less<_Key>’ and ‘std::greater<int>’
为什么类型不匹配,我应该如何解决?
std::set<T>
和std::set<T, std::greater<int>>
是完全不同的类型。这是一个更通用的版本:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
>
auto make_set_helper(std::set<Key, Compare, Allocator>& s)
{
return set_helper(s);
}
class本身也应该有所有这些模板参数。或者:
template<class ...P>
auto make_set_helper(std::set<P...>& s)
{
return set_helper(s);
}
std::set
接受三个模板参数。当你只指定第一个时,第二个(比较器)和第三个(分配器)是默认的。所以 std::set<T>
是 std::set<T,std::less<T>,std::allocator<T>>
的缩写。如果您想接受具有不同比较器的集合,请同时使用模板参数:
#include <set>
template <typename T,typename Compare>
void foo(std::set<T,Compare>& x){}
template <typename T>
void bar(std::set<T>& x){}
int main(){
std::set<int> a;
std::set<int,std::greater<int>> b;
foo(a);
foo(b);
bar(a); // ok
//bar(b); // error
}
我浏览了很多出现相同错误的帖子,但找不到适用于我的问题的帖子,无论如何,如果这是重复的,我深表歉意。
无论如何,我的任务是制作一个名为 set_helper 的 class,它使 std::sets 更易于使用。 set_helper 将一个集合作为其构造函数参数,为了帮助进行模板类型推导,我还必须制作一个名为 make_set_helper 的函数,该函数应该可以使类型推导更容易。我不完全明白那是什么意思,所以这是我试过的。
MRE 与 main.cpp
和 sethelp.h
main.cpp
#include<set>
#include "sethelp.h"
int main()
{
std::set<int, std::greater<int> > sg;
sg.insert( 0 );
sg.insert( 1 );
make_set_helper( sg );
return 0;
}
sethelp.h
#pragma once
template<class T>
class set_helper
{
private:
std::set<T>* s;
public:
set_helper(std::set<T>& s) { this->s = &s; }
bool operator==(T other) { return this == other; }
std::set<T>* get_set() {return this->s;}
};
template<class T>
set_helper<T> make_set_helper(std::set<T>& s)
{
return set_helper(s);
}
这是错误信息
error: no matching function for call to ‘make_set_helper(std::set<int, std::greater<int> >&)’
108 | make_set_helper( sg ) += sih;
note: candidate: ‘template<class T> set_helper<T> make_set_helper(std::set<T>&)’
79 | set_helper<T> make_set_helper(std::set<T>& s)
note: template argument deduction/substitution failed:
note: mismatched types ‘std::less<_Key>’ and ‘std::greater<int>’
为什么类型不匹配,我应该如何解决?
std::set<T>
和std::set<T, std::greater<int>>
是完全不同的类型。这是一个更通用的版本:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
>
auto make_set_helper(std::set<Key, Compare, Allocator>& s)
{
return set_helper(s);
}
class本身也应该有所有这些模板参数。或者:
template<class ...P>
auto make_set_helper(std::set<P...>& s)
{
return set_helper(s);
}
std::set
接受三个模板参数。当你只指定第一个时,第二个(比较器)和第三个(分配器)是默认的。所以 std::set<T>
是 std::set<T,std::less<T>,std::allocator<T>>
的缩写。如果您想接受具有不同比较器的集合,请同时使用模板参数:
#include <set>
template <typename T,typename Compare>
void foo(std::set<T,Compare>& x){}
template <typename T>
void bar(std::set<T>& x){}
int main(){
std::set<int> a;
std::set<int,std::greater<int>> b;
foo(a);
foo(b);
bar(a); // ok
//bar(b); // error
}