繁体   English   中英

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

[英]C++ template typedef as template function argument

为什么编译器找不到read1的匹配? 我没有看到read1read2之间的区别; 嵌套的typedef模板有没有限制,比如Foo类中的那个?

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>&)’
Foo::Handle f1;    
read1(f1);

传递给read1的类型是Handle<Foo> ,而不是Foo。

模板不是继承。 Handle<Foo>是一个不同于Handle<Foo>的独特类,因此没有Handle<Foo>::Handle

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

首先,如果不提供像read1<Foo>(f1)这样的显式模板参数,您将永远无法调用此函数。 阅读SFINAE

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM