关于C++:模板类中的Typedef不工作

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

一切正常。为什么它不起作用和/或如何使它起作用?

事先谢谢你的帮助


试着把typename放在my_string_map::type论点之前。

有关详细信息,请参阅:https://isocpp.org/wiki/faq/templates_nondependent name lookup types。


my_string_map::type是一个依赖名称,因为它依赖于模板参数T。对于从属名称,需要使用typename

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。