1

我有以下简单的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);
        }
    };
}
4

2 回答 2

6

X这只是已经多次讨论过的问题的另一种形式:从类型到类型不存在一对一的映射,T例如MyMatrix<T>::Vector3 == X.

简单的例子:

MyMatrix<double> { typedef Vector3 int; };
MyMatrix<float> { typedef Vector3 int; };

stringToTypeImpl<int> // Help, what is "T"?
于 2013-09-16T08:34:07.017 回答
0

克雷克的回答和我的评论解释了这个问题。类型系统无法将成员映射到成员的父级,因此::运算符停止需要匹配的推导过程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 名称别名的类型。

于 2013-09-16T09:16:52.690 回答