Статические встроенные методы? - PullRequest
9 голосов
/ 27 октября 2009

Хорошо,

Вот что я пытаюсь сделать ... Сейчас он компилируется, но не может соединиться ... 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 не имеет переменных-членов ... это не имеет смысла.

Ответы [ 4 ]

10 голосов
/ 27 октября 2009

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

5 голосов
/ 27 октября 2009

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

3 голосов
/ 27 октября 2009

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

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

1 голос
/ 27 октября 2009

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

...