2009-10-27 3 views
9

Хорошо,Статические встроенные методы?

Вот что я пытаюсь сделать ... Сейчас это компилирует, но не суметь на увязывание ... LNK2001

Я хочу статические методы, потому что нет переменных-членов, однако Я также хочу, чтобы они были встроены в ускорение, которое они предоставляют.

Каков наилучший способ для этого? Вот то, что я в двух словах:

/* foo.h */ 
class foo 
{ 
    static void bar(float* in); 
}; 

/* foo.cpp */ 
inline void foo::bar(float* in) 
{ 
    // some dark magic here 
} 

Я пытаюсь сделать это, потому что я хочу быть в состоянии пойти:

foo::bar(myFloatPtr); 

Foo не имеет каких-либо переменных-членов ... это не имеет смысла.

+0

Также, с точки зрения дизайна, можно ли использовать ссылку на поплавок, а не на указатель? Обычно предпочтительной является ссылка. – GManNickG

+0

да, я знаю ... но в этом случае я не могу обойти динамику :) – Polaris878

+0

++ 1 Для «темной магии здесь». – nahpr

ответ

10

Если вы вызываете бар из другого файла cpp, кроме foo.cpp, он должен находиться в файле заголовка.

+1

grrrr, что имеет смысл – Polaris878

3

Вы должны определить свою встроенную функцию в файле заголовка, а не отдельный файл реализации. Определения необходимы, если заголовочный файл # включен, если они надеются быть встроенным, в конце концов.

Ошибка связи, которую вы видите, заключается в том, что объявление (в файле заголовка) не сообщает компилятору, что метод должен быть встроенным, тогда как реализация является встроенной, поэтому недоступна для связывания.

5

Во-первых, я бы поставил их в namespace, потому что нет никакой логики в этом "class". Во-вторых, вы можете напрямую определить тело функции в файле заголовка, чтобы позволить компилятору их видеть. В противном случае вам понадобится whole program optimization, который будет использоваться компоновщиком для встраивания этих функций (AFAIK).

+0

Да, вы, вероятно, прав насчет пространства имен ... Я имел их в классах, потому что все они имели схожие функции – Polaris878

1

Вообще встроенные функции реализованы там, где они объявлены (в файле заголовка). Компилятор свободен для встроенных функций, так как у вас есть они, но вы не можете force это для inline что угодно. Если вы используете Visual C++, включите «inline any подходящий», «генерация кода времени» и «благоприятный быстрый код».

Смежные вопросы