Typedef in template class not working
本问题已经有最佳答案,请猛点这里访问。
这可能是一个愚蠢的问题,但我盯着这段代码看了一会儿,想不出怎么了。编译:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <string> #include <map> template <typename T> struct my_string_map { typedef std::map<std::string, T> type; }; template <typename T> bool add_to_string_map(my_string_map<T>::type map, std::string str, T x) { if (map.find(str) != map.end()) return false; map[str] = x; return true; } |
我得到:
1 2 3 4 | foo.cpp:8: error: template declaration of ‘bool add_to_string_map’ foo.cpp:8: error: expected ‘)’ before ‘map’ foo.cpp:8: error: expected primary-expression before ‘str’ foo.cpp:8: error: expected primary-expression before ‘x’ |
(我的"字符串"地图类的定义取自本论坛的另一条线索)
当我专门化我使用的模板类型时,比如
1 2 3 4 5 6 7 | bool add_to_string_int_map(my_string_map<int>::type map, std::string str, int x) { if (map.find(str) != map.end()) return false; map[str] = x; return true; } |
一切正常。为什么它不起作用和/或如何使它起作用?
事先谢谢你的帮助
试着把
有关详细信息,请参阅:https://isocpp.org/wiki/faq/templates_nondependent name lookup types。
1 2 3 4 | template <typename T> bool add_to_string_map(typename my_string_map<T>::type map, std::string str, T x) { ... } |
编译器将无法推导t,这对人类来说是显而易见的,但从编译器的角度来看,这种演绎是不可能的。专门化工作是因为您不再要求编译器推断t。