使用const的C ++模板专业化

时间:2013-02-26 18:02:59

标签: c++ templates template-specialization

我显然误解了关于模板专业化的重要事项,因为:

template<typename type> const type getInfo(int i) { return 0; }
template<> const char* getInfo<char*>(int i) { return nullptr; }

无法编译:

src/main.cpp:19:24: error: no function template matches function
        template specialization 'getInfo'

,而

template<typename type> type getInfo(int i) { return 0; }
template<> char* getInfo<char*>(int i) { return nullptr; }

工作正常。如何将const与模板特化一起使用?我的菜鸟错误是什么?

我在clang ++上使用c ++ 11。

2 个答案:

答案 0 :(得分:5)

请注意,在第一个示例中,返回类型为const type,因此const适用于整个类型。如果typechar*(与您的专业化相同),则返回类型为char * const。编译得很好:

template<typename type> const type getInfo(int i) { return 0; }
template<> char* const getInfo<char*>(int i) { return nullptr; }

这是有道理的 - 如果将类型专门化为指针。为什么模板对指针指向的内容有任何发言权?

但是,在这种情况下,我认为返回类型为const的原因并不多。

答案 1 :(得分:1)

如果你需要能够返回字符串常量,请使用:

template<typename type> type getInfo(int i) { return 0; }
template<> const char* getInfo<const char*>(int i) { return nullptr; }

你试图做的是:

const int getInfo( int i ) { return 0; }

它没有多大意义。