我有以下简单的strinToTypeImpl
函数,它可以将任何类型的字符串转换为模板类型。我担心的问题是编译器告诉我typename MyMatrix<T>::Vector3
的部分特化:
模板参数T未在部分专业化中使用
我不能在专业化中使用从属名称吗?
namespace details
{
template<typename T>
struct stringToTypeImpl{
bool operator()(T& t, const std::string& s)
{
std::istringstream iss(s);
return !(iss >> t).fail();
}
};
template<typename T>
struct stringToTypeImpl< typename MyMatrix<T>::Vector3 >{
// Replacing typename MyMatrix<T>::Vector3 by
// Eigen::Matrix<T,3,1> WORKS but why?
bool operator()(typename MyMatrix<PREC>::Vector3 & t, const std::string& s)
{
stringToVector3<PREC>(t,s);
}
};
}
答案 0 :(得分:6)
这只是问题的另一种形式,已经多次讨论过:没有从X
类型到类型T
的一对一映射,MyMatrix<T>::Vector3 == X
。
简单示例:
MyMatrix<double> { typedef Vector3 int; };
MyMatrix<float> { typedef Vector3 int; };
stringToTypeImpl<int> // Help, what is "T"?
答案 1 :(得分:0)
Kerreck的回答和我在那里的评论解释了这个问题。类型系统无法将成员映射到成员父级,因此::
运算符会停止需要与T
匹配的演绎过程。
解决方案的简单方法是将Vector3
置于外部并将其专门化为矩阵类型,然后使成员MyMatrix< T >::Vector3
成为typedef。
template< typename Matrix >
struct Vector3 {
typename Matrix::ValueType x, y, z;
};
template< typename T >
struct MyMatrix {
typedef Vector3< MyMatrix > Vector3;
};
StringToTypeImpl
的部分特化需要在最终模板类型上,而不是typedef。虽然特化可以将类型与单个typedef名称别名的类型匹配,但是部分特化在一组typedef中不匹配。