这段代码编译
\ntemplate<typename T>\nstruct A {\n struct Inner {} inner;\n void foo(Inner in);\n};\n\ntemplate<typename T>\nvoid A<T>::foo(typename A<T>::Inner in) {\n\n}\n\nint main() {\n A<int> a;\n a.foo(a.inner);\n}\nRun Code Online (Sandbox Code Playgroud)\ntypename A<T>::Inner如果我更改为别名模板,则不会
template<typename T>\nusing AInner = typename A<T>::Inner;\n\ntemplate<typename T>\nvoid A<T>::foo(AInner<T> bar) {\n\n}\nRun Code Online (Sandbox Code Playgroud)\n编译器抱怨说error: no declaration matches \xe2\x80\x98void A<T>::foo(AInner<T>)\xe2\x80\x99
我不太熟悉别名模板的规则。他们不是同一类型吗?
\n编辑:\n这是完整的演示:
\n// 你好.cpp
\ntemplate<typename T>\nstruct A {\n struct Inner {} inner;\n void foo(Inner in);\n};\n\ntemplate<typename T>\nusing AInner = typename A<T>::Inner;\n\ntemplate<typename T>\nvoid A<T>::foo(AInner<T> in) {\n\n}\n\nint main() {\n A<int> a;\n a.foo(a.inner);\n}\n …Run Code Online (Sandbox Code Playgroud)