[英]C++ using function template in class template
template <int C> class MyClass;
...
template <int C>
double trans(MyClass<C> &a)
{
//return some double
}
//this is supposed to be function template
template <int C>
double func(MyClass<2> &a)
{
//return some double
}
template <int C>
MyClass<C-1> func(MyClass<C> &a)
{
MyClass<C-1> ret;
return ret;
}
template <int C>
double otherFunc(MyClass<C> &a)
{
double result;
if(C == SOME_CONSTANT)
result = func(a);
else
result = trans(func(a));
}
我的问题是我想检查参数otherFunc
调用函数模板func
(返回双otherFunc
)而不是类模板func
的成员函数(返回MyClass)中的模板参数C。 但是以某种方式,编译器尝试对返回MyClass的func
进行func
if(C == SOME_CONSTANT)
result = func(a);
这部分使我得到了编译器错误(因为double = MyClass不可行)。 我应该如何解决这个问题?
我想原因是:
if(C == SOME_CONSTANT)
result = func(a);
else
result = trans(func(a));
在运行时进行检查,而模板特化和类型检查则在编译期间进行。 这两个功能:
template <int C>
double func(MyClass<2> &a)
{
//return some double
}
template <int C>
MyClass<C-1> func(MyClass<C> &a)
{
MyClass<C-1> ret;
return ret;
}
具有几乎相同的签名-唯一的区别是,对于C==2
,使用一个返回double
签名,否则使用一个返回MyClass<2>
签名。 因此,您得到的是:
// for C==2
if(C == SOME_CONSTANT)
result = func<2>(a); // returns double - just like you wanted
else
result = trans<2>(func<2>(a)); // pass double into trans<?>(MyClass<?>), so the parameter cannot be resolved unless you specified some implicit constructor/explicit conversion operator
// for e.g. C==3
if(C == SOME_CONSTANT)
result = func<3>(a); // returns MyClass<2> while result is double
else
result = trans<2>(func<3>(a)); // pass MyClass<2> into trans<?>(MyClass<>) - like you wanted
因此,基本上,您的代码在第一种或第二种情况下的专业化类型均无效。 您可以改为执行以下操作:
template <>
MyClass<2> func<2>(MyClass<2> &a)
{
return a;
}
template <int C>
MyClass<C-1> func(MyClass<C> &a)
{
return MyClass<C-1>;
}
保持模板类型一致,然后:
if(C == SOME_CONSTANT)
result = trans(a);
else
result = trans(func(a));
这只是如何处理它的一个示例。 如果您避免弄乱针对不同模板专业化键入的不同返回值,事情应该会更容易。
很难在评论中详细说明,因此我将发布答案。 回顾一下我在评论中所说的话:
otherFunc
中使用if
/ else
来为特定的MyClass
实例进行编译是不合法的, otherFunc
定义来处理MyClass<2>
。 样例代码:
#include <iostream>
template <int C>
class MyClass
{ };
template <int C>
double trans(const MyClass<C> &a)
{
return C + 700;
}
template <int C>
MyClass<C-1> func(MyClass<C> &a)
{
MyClass<C-1> ret;
return ret;
}
double func(MyClass<2>& a)
{
return 200.0;
}
template <int C>
double otherFunc(MyClass<C> &a)
{
return trans(func<C>(a));
}
template <>
double otherFunc<2>(MyClass<2>& a)
{
return func(a);
}
int main()
{
MyClass<2> a;
std::cout << otherFunc(a) << '\n';
MyClass<4> b;
std::cout << otherFunc(b) << '\n';
}
输出:
200
703
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.