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

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 に答える