【发布时间】:2023-08-31 15:37:02
【问题描述】:
为什么编译器找不到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);
}
G++ 编译器输出,(G++ 4.4.5)
g++ -c -I. main1.cpp
main1.cpp: In function ‘int main(int, char**)’:
main1.cpp:37: error: no matching function for call to ‘read1(Handle<Foo>&)’
【问题讨论】:
-
我删除了多余的
Internal命名空间,保持示例简洁。 -
使用 G++ 4.4.5,您的编辑会破坏代码,
g++ -c main.cpp main.cpp:8: error: declaration of ‘typedef class Handle<Foo> Foo::Handle’ main.cpp:3: error: changes meaning of ‘Handle’ from ‘class Handle<Foo>’ main.cpp: In function ‘int main(int, char**)’: main.cpp:27: error: no matching function for call to ‘read1(Handle<Foo>&)’