C ++静态模板函数可以在具有C链接的结构中吗?

时间:2015-03-04 19:12:53

标签: c++ class templates static linkage

我的头文件中有以下声明:

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文件中。我不喜欢这样做,因为在结构中使用它会增加代码的可读性。

有没有办法在这种情况下拥有静态模板?

2 个答案:

答案 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"?

那里最重要的部分:

    对于班级成员,
  • extern“C”被忽略
  • 最多一个具有特定名称的函数可以具有“C”链接(无论命名空间如何)
  • '静态'在'extern'中“C”'有效;如此声明的实体具有内部链接,因此没有语言链接

最重要的是中间的那个:当你实例化你的模板时,你将有两个具有相同名称但不同参数的函数,这些函数不是C直接支持的。所以C ++编译器需要修改名称对于模板化的功能。

另外,当你在结构体之外声明你的函数并且你说它是static时你给它内部链接,所以extern C将被忽略(这就是它在那种情况下编译的原因) )。您是否使用objdump查看已编译的名称以确保它没有被破坏?