pri*_*tor 5 c++ templates compiler-errors
好吧,我读了很多"无法推断模板论证"的问题,但似乎没有一个与我的案例相符 - 或者我不明白答案......
有一个我觉得正确的方向,但我没有为我的问题提取解决方案.
我标题中的精简代码如下所示:
template<typename T>
class TemplateProblem
{
public:
// Do I really need this or did I miss something from the STL?
template<typename Tin, typename Tout>
struct UnaryFunction : public std::unary_function<Tin, Tout>
{
virtual Tout operator()(Tin input) = 0;
};
template<typename Tin, typename Tout>
struct StaticCast : public UnaryFunction<Tin, Tout>
{
virtual Tout operator()(Tin input)
{
return static_cast<Tout>(input);
}
};
private:
T * const _data;
T const _bias;
template<typename Tin>
void Init(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias);
public:
template<typename Tin>
TemplateProblem(Tin * data, int length, Tin bias = Tin());
template<typename Tin>
TemplateProblem(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias = T());
};
template<typename T>
template<typename Tin>
void TemplateProblem<T>::Init(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias)
{
T mappedBias = mapper(bias);
for (int i = 0; i < length; i++)
{
_data[i] = data[i] + mappedBias;
}
}
template<typename T>
template<typename Tin>
TemplateProblem<T>::TemplateProblem(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias = T())
: _data(new T[length]), _bias(bias)
{
Init(data, length, mapper, bias);
}
template<typename T>
template<typename Tin>
TemplateProblem<T>::TemplateProblem(Tin * data, int length, Tin bias = T())
: _data(new T[length]), _bias(bias)
{
StaticCast<Tin, T> cast;
Init(data, length, cast, bias);
}
Run Code Online (Sandbox Code Playgroud)
我像这样实例化它:
unsigned char pixels[] = {23, 42, 65, 97};
TemplateProblem<int> tp(pixels, 4);
Run Code Online (Sandbox Code Playgroud)
从VS2012我收到以下消息:
Error 1 error C2784: 'void TemplateProblem<T>::Init(Tin *,int,TemplateProblem<T>::UnaryFunction<Tin,T>,Tin)' : could not deduce template argument for 'TemplateProblem<T>::UnaryFunction<Tin,T>' from 'TemplateProblem<T>::StaticCast<Tin,Tout>' ...\templateproblem.h 62 1 TemplateProblem
Error 2 error C2893: Failed to specialize function template 'void TemplateProblem<T>::Init(Tin *,int,TemplateProblem<T>::UnaryFunction<Tin,T>,Tin)' ...\templateproblem.h 62 1 TemplateProblem
Run Code Online (Sandbox Code Playgroud)
当我将两个structs移出时,也会出现错误class,如此答案所示.
编译器错误对于指示实际问题没有太大帮助。
实际的问题是您UnaryFunction<Tin, T>按值传递给Init函数(以及构造函数之一),但所有实例化UnaryFunction<>结果都是抽象类(不能按值传递)。简单的解决方案是使用引用传递UnaryFunction,以便mapper引用传入的实际对象。
STL 中传递函子的典型解决方案是使用单独的模板参数,如下所示:
template<typename T>
template<typename Tin, Tmapper>
void TemplateProblem<T>::Init(Tin * data, int length, Tmapper mapper, Tin bias)
{
T mappedBias = mapper(bias);
for (int i = 0; i < length; i++)
{
_data[i] = data[i] + mappedBias;
}
}
Run Code Online (Sandbox Code Playgroud)
那么你就不需要UnaryFunctionL<>基类了。如果mapper通过了不兼容,则在函数体中使用它时将对此进行诊断。
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |