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);