Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个构造函数重载不能工作?(出现模板和typedef)_C++_Templates_Visual Studio 2012_Typedef_Constructor Overloading - Fatal编程技术网

C++ 为什么这个构造函数重载不能工作?(出现模板和typedef)

C++ 为什么这个构造函数重载不能工作?(出现模板和typedef),c++,templates,visual-studio-2012,typedef,constructor-overloading,C++,Templates,Visual Studio 2012,Typedef,Constructor Overloading,我使用VS2012作为编译器。 首先,由于缺少模板别名 template <typename T> struct HvVector { typedef std::vector<T> rt; }; 看来编译器不知道我的第二个构造函数,为什么? 额外的TYPE*p试图为编译器提供我的真实类型,因为像HvVector::rt这样的typedef类型无法推断模板参数类型,除非我明确指定它 编辑: 这里有一个在线测试代码,它可以很好地与gcc 4.8.1兼容,所以我认为这

我使用VS2012作为编译器。

首先,由于缺少
模板别名

template <typename T>
struct HvVector
{
    typedef std::vector<T> rt;
};
看来编译器不知道我的第二个构造函数,为什么?

额外的
TYPE*p
试图为编译器提供我的真实类型,因为像
HvVector::rt
这样的
typedef
类型无法推断模板参数类型,除非我明确指定它

编辑:


这里有一个在线测试代码,它可以很好地与gcc 4.8.1兼容,所以我认为这是VS2012的问题:

问题在于构造函数所做的类型推断。通过将类设置为模板而不是构造函数,可以显式地设置类型。这项工作:

template<typename CLASS, typename TYPE>
class LetYouDo
{
public:
    LetYouDo(const std::string& name, TYPE (CLASS::*field))
    {
        std::cout << "3" << std::endl;
    }

    LetYouDo(const std::string& name, typename HvVector<TYPE>::rt (CLASS::*field), TYPE* p)
    {
        std::cout << "4" << std::endl;
    }        
};

LetYouDo<Victim,int> o1("m1", &Victim::m1);
LetYouDo<Victim,int> o2("m2", &Victim::m2, static_cast<int*>(0));
模板
让你去上课
{
公众:
LetYouDo(const std::字符串和名称,类型(类::*字段))
{
std::cout with
1>          [
1> T=int
1> ,_Ty=int
1>          ]
1> c:\users\all\documents\visualstudio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(24):参见“LetYouDo::LetYouDoInit”的声明
1> c:\users\all\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(47):错误C2780:“void LetYouDo::LetYouDoInit(const std::string&,TYPE CLASS::*)”:需要2个参数-提供3个参数
1> c:\users\all\documents\visualstudio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(18):参见“LetYouDo::LetYouDoInit”的声明
如果将类型显式化,则消息将消失:

LetYouDo o2;
o2.LetYouDoInit<Victim,int>("m2", &Victim::m2, static_cast<int*>(0));
LetYouDo o2;
o2.LetYouDoInit(“m2”,和受害者::m2,静态施法(0));

由于这是一个问答网站,是否真的需要声明您正在寻找答案-(好吧,这只是说
谢谢
…xD你能回答这个问题吗?真的需要一些帮助!不需要,越短越好…不管怎样,你能在一个实时编译器站点上发布一个mcve吗?看起来这个站点的编译器可以做到…但是vs2012不行,因为我没有或不知道那个编译器。重新标记问题以使编译器版本显式,并等待有专业知识的人前来,或与供应商联系。。。
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
template<typename CLASS, typename TYPE>
class LetYouDo
{
public:
    LetYouDo(const std::string& name, TYPE (CLASS::*field))
    {
        std::cout << "3" << std::endl;
    }

    LetYouDo(const std::string& name, typename HvVector<TYPE>::rt (CLASS::*field), TYPE* p)
    {
        std::cout << "4" << std::endl;
    }        
};

LetYouDo<Victim,int> o1("m1", &Victim::m1);
LetYouDo<Victim,int> o2("m2", &Victim::m2, static_cast<int*>(0));
class LetYouDo
{

    template<typename CLASS, typename TYPE>
    void LetYouDoInit(const std::string& name, typename HvVector<TYPE>::rt (CLASS::*field), TYPE* p)
    {
        std::cout << "4" << std::endl;
    }        
};

LetYouDo o2;
o2.LetYouDoInit("m2", &Victim::m2, static_cast<int*>(0));
1>c:\users\all\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(47): error C2784: 'void LetYouDo::LetYouDoInit(const std::string &,HvVector<TYPE>::rt CLASS::* ,TYPE *)' : could not deduce template argument for 'HvVector<TYPE>::rt CLASS::* ' from 'std::vector<T,std::allocator<_Ty>> Victim::* '
1>          with
1>          [
1>              T=int
1>  ,            _Ty=int
1>          ]
1>          c:\users\all\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(24) : see declaration of 'LetYouDo::LetYouDoInit'
1>c:\users\all\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(47): error C2780: 'void LetYouDo::LetYouDoInit(const std::string &,TYPE CLASS::* )' : expects 2 arguments - 3 provided
1>          c:\users\all\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(18) : see declaration of 'LetYouDo::LetYouDoInit'
LetYouDo o2;
o2.LetYouDoInit<Victim,int>("m2", &Victim::m2, static_cast<int*>(0));