我想创建一个接受多个模板别名的模板函数。 这是一个更有意义的简单示例。
有模板别名TAlias1 和TAlias2
template <typename T>
using TAlias1 = TClass1<T, 2>;
template <typename T>
using TAlias2 = TClass2<T, 3>;
...然后我想创建一个接受上述任何别名的模板函数:
template <typename T, template<typename> class TClass>
TClass<T> someOperation(const TClass<T> &a, const TClass<T> &b)
{
...
}
int main()
{
TAlias1<float> a;
TAlias1<float> b;
TAlias1<float> c = someOperation(a,b);
return 0;
}
但是它会导致 Visual Studio 2013 中的编译错误:
这种情况有什么解决办法吗?
编辑:
这是一个产生错误的完整示例:
template <typename T, int I>
struct TClass1 {};
template <typename T, int I>
struct TClass2 {};
template <typename T>
using TAlias1 = TClass1<T, 2>;
template <typename T>
using TAlias2 = TClass2<T, 3>;
// this should accept TAlias1 and TAlias2
template <typename T, template<typename> class TClass>
TClass<T> someOperation(const TClass<T> &a, const TClass<T> &b) { return {}; }
int main()
{
TAlias1<float> a;
TAlias1<float> b;
TAlias1<float> c = someOperation(a,b);
TAlias2<float> d;
TAlias2<float> e;
TAlias2<float> f = someOperation(d,e);
return 0;
}
错误:
error C2784: 'TClass<T> someOperation(const TClass<T> &,const TClass<T> &)' : could not deduce template argument for 'const TClass<T> &' from 'TClass1<float,2>'
最佳答案
问题出在 someOperation
函数的第二个模板参数中。模板别名不引入新类型,它的工作方式类似于 typedef。这意味着,即使 TAlias1
只接受一个模板参数,它仍然是一个带有 2 个参数的模板(其中设置了第二个参数)。
确实,如果您将函数更改为:
template <typename T, template<typename,int> class TClass>
TClass<T,2> someOperation(const TClass<T,2> &a, const TClass<T,2> &b)
{
return a+b;
}
它会编译(当然,你需要使operator+
const方法)。
更好的方法是不使用模板类作为第二个模板参数,并将函数更改为如下所示:
template <typename T1, typename T2>
auto someOperation(const T1 &a, const T2 &b) -> decltype(a+b)
{
return a+b;
}
或者甚至:
template <typename T>
T someOperation(const T &a, const T &b)
{
return a+b;
}
关于C++11模板函数接受多个模板别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23611398/