2015-03-04 5 views
1

У меня есть следующее заявление в моем файле заголовка:Может ли статическая функция шаблона C++ быть в структуре с C-связью?

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

. Что вы хотите достичь, используя ** член ** функцию с C-связью? Нет другой функции 'extern C' члена другого класса, способной использовать одно и то же имя? – MondKin

+0

@Mondkin: Речь идет о библиотеке на C++. Я думаю (я поддерживаю код кого-то еще), цель состоит в том, чтобы использовать тот же заголовочный файл библиотеки для программ на C и C++. Программы C видят «struct» и атрибуты, а программы на C++ видят все, но с C-связью. Ну, а затем член шаблона выходит из строя. –

ответ

0
// Inside header 
extern "C" { struct X; }; 
struct X { 
    template <typename T> static void f() {} 
}; 

// Inside cpp 
int main() { 
    X::f<int>(); 
} 
+1

, хотя этот кодовый блок может ответить на вопрос, попробуйте добавить соответствующее объяснение. – SMR

0

Я не думаю, что это возможно.

Проверить это другой вопрос и ответ на него: In C++ source, what is the effect of extern "C"?

Наиболее важные части оттуда:

  • ехЬегп «C» игнорируется для членов класса
  • более одной функции с конкретным имя может иметь связь «C» (независимо от пространства имен)
  • «статический» внутри «extern» C «'действителен; субъект, объявленный таким образом, имеет внутреннюю связь, и поэтому не имеет языковой связи

Главное, что есть в середине: при создании экземпляра шаблона у вас есть две функции с одинаковым именем, но разные параметры, которые напрямую не поддерживаются C. Поэтому компилятору C++ необходимо изменить имя для шаблонных функций.

Кроме того, когда вы объявляете свою функцию за пределами структуры, и вы говорите, что это static, вы даете ей внутреннюю связь, поэтому extern C будет проигнорирован (вот почему он компилируется в этом случае). Вы использовали objdump, чтобы увидеть скомпилированное имя, чтобы убедиться, что он не искалечен?