模板区域中的非可导入上下文

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?如果是,那么任何人都可以澄清不可导出区域的确切规则是什么?

vis*_*tor 3

类模板的类型无法根据传递给其构造函数的参数来确定。要知道哪些构造函数可用,编译器必须已经选择要Wrap实例化的构造函数。

在该#else块中,您已明确选择实例化Wrap<int>,因此编译器知道使用隐式Wrap<int>(int*)构造函数。


也许非正式地说:如果推导它的前提是知道要推导的类型是什么,那么该类型是不可推导的。