c模板化构造函数错误

更模糊的困境……我喜欢C,但有时我讨厌它.

我无法弄清楚为什么编译器在这里抱怨,以及我能做些什么呢.

struct blah
{
   template<class t>
   blah(void(*)(t),t){}
};

void Func(int i) {}
void Func2(int& i) {}

void test()
{
   int i = 3;
   blah b(Func,i);   
   blah b2(Func2,i);        //error C2660: 'blah::blah' : function does not take 2 arguments
   blah b3(Func2,(int&)i);  //error C2660: 'blah::blah' : function does not take 2 arguments

}

这里发生了什么?

我正在使用MSVC2008.

解决方法@H_403_12@
其他答案解释了发生了什么:当模板参数推导找到两种推导模板参数的方法时,它会单独查看每个参数,并且它们都必须完全一致.

你可以通过确保第二次使用t在“非推导的上下文”中来使这个类按照你预期的方式工作:

template<typename T>
struct identity { typedef T type; };

struct blah
{
   template<class t>
   blah(void(*)(t),typename identity<t>::type){}
};

这样当调用blah构造函数时,C将从函数指针中推导出t,但不会尝试从第二个参数中推导出它.推导出的类型然后在两个地方被替换.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...