VS2012 をコンパイラとして使用しています。
まずtypedef
、不足によるtemplate aliasing
template <typename T>
struct HvVector
{
typedef std::vector<T> rt;
};
次に、このクラスのオブジェクトをインスタンス化します。
class LetYouDo
{
public:
template<typename CLASS, typename TYPE>
LetYouDo(const std::string& name, TYPE (CLASS::*field))
{
std::cout << "3" << std::endl;
}
template<typename CLASS, typename TYPE>
LetYouDo(const std::string& name, typename HvVector<TYPE>::rt (CLASS::*field), TYPE* p)
{
std::cout << "4" << std::endl;
}
};
次のようなクラスの例を使用します。
class Victim
{
public:
int m1;
HvVector<int>::rt m2;
};
したがって、実際のケースは次のようになります。
Victim v;
v.m1 = 10;
v.m2.push_back(10);
LetYouDo o1("m1", &Victim::m1);
LetYouDo o2("m2", &Victim::m2, static_cast<int*>(0));
しかし、コンパイラはエラーを出します:
error C2660: 'LetYouDo::LetYouDo' : function does not take 3 arguments
コンパイラが 2 番目のコンストラクタを認識していないように見えますが、なぜですか?
余分なTYPE* p
ものは、コンパイラに実際の型を与える試みです。typedef
型のようなものHvVector<TYPE>::rt
は、明確に指定しない限り、テンプレート引数の型を推測できないためです。
編集:
で問題なく動作するオンライン テスト コードを次にgcc 4.8.1
示します。これは VS2012 の問題だと思います: ideone.com/YawsaB