Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板typedef作为模板函数参数_C++_Templates - Fatal编程技术网

C++ C++;模板typedef作为模板函数参数

C++ C++;模板typedef作为模板函数参数,c++,templates,C++,Templates,为什么编译器没有找到read1的匹配项?我看不出read1和read2之间有什么区别;像Foo类中的嵌套typedef模板有限制吗 template<typename T> class Handle{}; class Foo{ public: typedef Handle<Foo> Handle; }; template<typename T> void read1(typename T::Handle){} template<typen

为什么编译器没有找到
read1
的匹配项?我看不出
read1
read2
之间有什么区别;像
Foo
类中的嵌套typedef模板有限制吗

template<typename T>
class Handle{};

class Foo{
public:
    typedef Handle<Foo> Handle;
};


template<typename T>
void read1(typename T::Handle){}

template<typename T>
void read2(Handle<T>){}


int main(int argc, char** argv)
{
    Foo::Handle f1;    
    read1(f1);

    Foo::Handle f2;
    read2(f2);
}
模板
类句柄{};
福班{
公众:
typedef手柄;
};
模板
void read1(typename T::Handle){}
模板
void read2(句柄){}
int main(int argc,字符**argv)
{
Foo::句柄f1;
read1(f1);
Foo::句柄f2;
read2(f2);
}
G++编译器输出,(G++4.4.5)

g++-c-I.main1.cpp
main1.cpp:在函数“int main(int,char**)”中:
main1.cpp:37:错误:调用“read1(Handle&)”没有匹配的函数
模板
void read1(类型名T::Handle)
{
}
首先,如果不提供像
read1(f1)
这样的显式模板参数,就永远无法调用此函数。仔细阅读

其次,编译器应该如何找出
T
是什么?它必须测试所有可能编写的类的所有嵌套typedef。听起来不可能?是的

Foo::Handle f1;    
read1(f1);
传递给read1的类型是
句柄
,而不是Foo


模板不是继承
Handle
是一个不同的类,它不是一个Foo,因此没有
Handle::Handle

我删除了冗余的
内部
命名空间,保持示例简洁。使用G++4.4.5,您的编辑会破坏代码,
g++-c main.cpp main.cpp:8:错误:声明'typedef class Handle Foo::Handle'main.cpp:3:错误:将'class Handle'main.cpp:In函数'int main(int,char**)':main.cpp:27:错误:调用'read1(Handle&')时没有匹配的函数“
它不必测试您可能编写的每个类;它只需要测试read1调用时定义的类。可能(与编译器处理模板所需的某些事情相比,甚至很容易),但不是按照标准进行的。为什么可以像read2那样找到参数?它只需要测试Foo,没有其他类型,不仅需要测试在该点定义的所有类,还需要测试所有可能的模板实例化(虽然可能是模板形式)。但它将如何解决歧义?通常程序员必须修复这些问题,但在这种情况下,一些完全不相关的代码更改(不同的名称空间和所有名称空间)可能会导致歧义,因此让程序员修复这些问题并不是一个真正的选项@José:在这个简单的例子中,可能只需要测试foo,但是大多数scnearious都比较复杂,大多数时候不起作用的语言特性也不那么流行
template<typename T>
void read1(typename T::Handle)
{
}
Foo::Handle f1;    
read1(f1);