4

为什么这个简单的代码不起作用?

template<class U>
class retype 
{ 
    typedef U type; 
};

class object
{
public:
    template<class U>
    int create(typename retype<U>::type p)
    {
        return 4;
    }
};

int main()
{
    int n = object().create(5);

    return 0;
}

使用 GCC 编译时出现此错误:

test.cpp: In function ‘int main()’:
test.cpp:20: error: no matching function for call to ‘object::create(int)’

问题出在哪里?

4

1 回答 1

5

您依赖于从函数参数中推导模板参数。但是函数模板参数不能被推导,因为那是一个不可推导的上下文。

更具体地说,即使是U也无法推导出模板参数。因为可能有一个专门的定义为:retype<U>::typeintretype

template<>
struct retype<X>
{
      typedef int type;
};

所以你看,给定retype<U>::typeis int,模板参数U也可以X

事实上,可能有不止一种这样的专业化,所有这些专业化都可以定义typeint. 所以没有一对一的关系。编译器不能唯一地推断出U.

于 2013-01-01T15:44:09.763 回答