编译出现这个错误,原因是特化模板放到模板调用后面了。
如果特化的定义在使用模板之后出现,编译器将无法正确地实例化特化。
下面是正常能编译过的:
template <typename T>
void foo(T value) {
// 模板函数的定义
}
template<>
void foo<int>(int value) {
// int 类型的特化定义
}
int main() {
foo(42);
}
下面是编译会出错的:
template <typename T>
void foo(T value) {
// 模板函数的定义
}
int main() {
foo(42);
}
template<>
void foo<int>(int value) {
// int 类型的特化定义
}
出错提示:
/home/user/work/testdir/a.cpp:11:24: error: specialization of ‘void foo(T) [with T = int]’ after instantiation
11 | void foo<int>(int value) {
| ^
这个有时跟编译选项有关,release编译有这个问题,debug没有。
我遇到这个是因为Qt的一个模板特化是用宏提供的,这个宏在代码里调用了,而这个宏前面有使用这个模板,所以Release编译报错。
解决方法,把这个宏调用放到c++最前面,或加到头文件里,保证这个特化的模板使用前已经定义。
当模板特化定义出现在模板使用之后,会导致编译错误。正确做法是确保特化模板在调用之前已定义。文章中提到的问题在Release编译模式下出现,由于Qt的一个模板特化宏定义顺序导致,解决方案是调整宏调用的位置或将其放入头文件中。

6187

被折叠的 条评论
为什么被折叠?



