我不明白为什么在这种情况下无法推断出T:
Listen 9001
<VirtualHost *:9001>
ServerAdmin admin@admin.askcomputers.co.in
DocumentRoot /var/www/html/example2.com
ServerName www.example2.com
</VirtualHost>
从GCC 4.7.1到-std = c ++ 14
template<class T>
class MyType
{
T * data;
};
class MyOtherType
{
};
template<typename T>
struct MyType_OutArg
{
typedef MyType<T> & type;
};
template<typename T>
void
DoSomething(typename MyType_OutArg<T>::type obj)
{
}
void func(MyType_OutArg<MyOtherType>::type obj)
{
DoSomething(obj);
}
当然以下工作:
<source>: In function 'void func(MyType_OutArg<MyOtherType>::type)':
26 : <source>:26:20: error: no matching function for call to 'DoSomething(MyType<MyOtherType>&)'
DoSomething(obj);
^
26 : <source>:26:20: note: candidate is:
19 : <source>:19:1: note: template<class T> void DoSomething(typename MyType_OutArg<T>::type)
DoSomething(typename MyType_OutArg<T>::type obj)
^
19 : <source>:19:1: note: template argument deduction/substitution failed:
26 : <source>:26:20: note: couldn't deduce template parameter 'T'
DoSomething(obj);
^
Compiler returned: 1
但我不确定为什么这是必要的。编译器是否应该有足够的信息?
答案 0 :(得分:8)
这是因为您的案例是非推断的上下文。
引自http://en.cppreference.com/w/cpp/language/template_argument_deduction:
非推断的上下文
在下列情况下,用于组成P的类型,模板和非类型值不参与模板参数推导,而是使用在别处推导或明确指定的模板参数。如果模板参数仅在非推导的上下文中使用且未明确指定,则模板参数推断将失败。
1)嵌套名称说明符(使用qualified-id
指定的类型的作用域解析运算符::)左侧的所有内容
在您的情况下,typename MyType_OutArg<T>::type
不会参与类型扣除,并且T
在其他地方无法识别,因此会忽略此模板函数。