iam*_*ind 5 c++ templates wrapper
template<typename T>
struct Wrap {
Wrap(T *p) {}
};
#ifdef TEMPLATE
template<typename T>
void foo (Wrap<T> t) {} // version-1
#else
void foo (Wrap<int> p) {} // version-2
#endif
int main () {
foo(new int);
}
Run Code Online (Sandbox Code Playgroud)
当#else部分被编译,编译那张精致和版-2被选中.如果我尝试编译#ifdef部分,我希望应该选择版本1.但编译器给出了错误,
错误:没有匹配函数来调用`foo(int*)'
我是否触及了不可扣除的部分template foo?如果是,那么任何人都可以澄清不可导出区域的确切规则是什么?
类模板的类型无法根据传递给其构造函数的参数来确定。要知道哪些构造函数可用,编译器必须已经选择要Wrap实例化的构造函数。
在该#else块中,您已明确选择实例化Wrap<int>,因此编译器知道使用隐式Wrap<int>(int*)构造函数。
也许非正式地说:如果推导它的前提是知道要推导的类型是什么,那么该类型是不可推导的。