考虑以下
#include <iostream>
template <typename T, bool B>
struct C {
using value_type = T;
value_type f(value_type v);
};
template <bool B>
auto C<int, B>::f(value_type v) -> value_type {
return v;
}
int main(int argc, char * argv[]) {
C<int, true> c;
std::cout << c.f(5) << std::endl;
return 0;
}
使用g ++ 4.9我收到错误
test.cpp:11:26:错误:'C :: f'被声明为'内联'变量
内联自动C :: f(value_type v) - &gt; value_type {
test.cpp:11:26:错误:非模板'auto C :: f'的模板定义 test.cpp:11:26:错误:'value_type'未在此范围内声明
问题在于value_type
。当我用typename C<int, B>::value_type
替换它时它会起作用但是这个时间要长得多,特别是在现实世界的应用程序中它可能会很长(我的情况)。有没有办法让这个工作用短变体?
PS:它适用于完整的模板专业化,但我必须只有部分专业化。
答案 0 :(得分:2)
当您使用模板时,实际上您正在定义新类型,即使是模板专业化。
因此,正确的程序工作方式是完全重新定义专业化。
#include <iostream>
template <typename T, bool B>
struct C {
T f(T v);
};
template <bool B>
struct C<int,B> {
int f(int v) {
return v;
}
};
int main(int argc, char * argv[]) {
C<int, true> c;
std::cout << c.f(5) << std::endl;
return 0;
}