我的头文件中有以下声明:
extern "C" {
struct lfModifier {
template<typename T>
static void ModifyColor_Vignetting_PA (
void *data, float x, float y, T *rgb, int comp_role, int count);
}
}
GCC可能理所当然地抱怨“错误:带C链接的模板”。但毕竟模板是静态的。我可以轻松地将它从类中移出到cpp文件中。我不喜欢这样做,因为在结构中使用它会增加代码的可读性。
有没有办法在这种情况下拥有静态模板?
答案 0 :(得分:0)
// Inside header
extern "C" { struct X; };
struct X {
template <typename T> static void f() {}
};
// Inside cpp
int main() {
X::f<int>();
}
答案 1 :(得分:0)
我认为这不可能。
检查这个问题及其答案: In C++ source, what is the effect of extern "C"?
那里最重要的部分:
最重要的是中间的那个:当你实例化你的模板时,你将有两个具有相同名称但不同参数的函数,这些函数不是C直接支持的。所以C ++编译器需要修改名称对于模板化的功能。
另外,当你在结构体之外声明你的函数并且你说它是static
时你给它内部链接,所以extern C
将被忽略(这就是它在那种情况下编译的原因) )。您是否使用objdump
查看已编译的名称以确保它没有被破坏?