前向声明模板变量将导致ld错误。
#include <iostream>
template<class T> extern int a;
template<class T> int a = 1;
int main()
{
std::cout << a<int> << a<float>;
return 0;
}
$ LANG=C g++ main.cpp -o main
/usr/bin/ld: /tmp/cccOb25F.o: in function `main':
main.cpp:(.text+0x6): undefined reference to `a<int>'
/usr/bin/ld: main.cpp:(.text+0x1d): undefined reference to `a<float>'
collect2: error: ld returned 1 exit status
但是,未经模板的前向声明变量和前向声明模板函数可以正常工作。
#include <iostream>
extern int a;
int a = 1;
template<class T> int b();
template<class T> int b()
{
return 2;
}
int main()
{
std::cout << a << b<int>();
return 0;
}
那么,在C ++中是否有可能使前向声明的模板变量起作用?
编辑:
由于clang++
工作正常,也许我意外地发现了g++
的一个错误?
编辑2:
我找到了一个关于2.5年前的错误报告(在这里),这正是同样的问题。哦,我们需要一个能够阅读gcc源代码并修复它的人...
a
定义为外部变量? - chtzextern
,它会报另一个错误redefinition of ‘template<class T> int a’
。 - 陈浩南