Ok, tôi đọc Xuyên khá một số “không thể suy ra mẫu lập luận” câu hỏi nhưng không ai có vẻ để phù hợp với trường hợp của tôi - hoặc tôi không hiểu câu trả lời ...Suy luận mẫu đối số cho mẫu lồng nhau không
Có one mà tôi cảm thấy đi đúng hướng, nhưng tôi đã không giải được giải pháp cho vấn đề của mình.
Các lột xuống mã trong phần đầu của tôi trông như thế này:
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);
}
Tôi nhanh chóng nó như thế này:
unsigned char pixels[] = {23, 42, 65, 97};
TemplateProblem<int> tp(pixels, 4);
Từ VS2012 tôi nhận được những tin nhắn này:
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
Các cũng xảy ra khi tôi di chuyển hai số struct
ra khỏi số class
là this answer gợi ý.
Mã instantiation và thông báo lỗi hoàn toàn không liên quan. Lỗi nói về 'StaticCast', nhưng bạn không có bất kỳ nơi nào trong mã instantiation của bạn. –
Xeo
http://liveworkspace.org/code/4psoUf$0 biên dịch tốt ... mã của bạn (trước khi sửa đổi) không thể kết hợp được. – ForEveR
@Xeo: StaticCast được sử dụng 3 dòng từ phía dưới. – primfaktor