我正在使用 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
所以看起来编译器不知道我的第二个构造函数,为什么?
额外TYPE* p
的内容是尝试为编译器提供我的真实类型,因为typedef
除非HvVector<TYPE>::rt
我明确指定,否则无法推断出模板参数类型。
编辑:
这是一个可以正常工作的在线测试代码gcc 4.8.1
,所以我认为这是VS2012的问题:ideone.com/YawsaB