2010-10-23 5 views
3

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

// zero.cpp 

class Zero 
{ 
    static void zero() { one(5); } 
}; 

// one.h 

template <typename T> 
static void one(T& var); 

// one.cpp 

template <typename T> 
void one(T& var) { } 

// main.cpp 

... 

Zero::zero() 

... 

У меня возникли проблемы с получением этого, чтобы связать, я получаю неопределенную ссылку функцию, которую я пытаюсь определить в one.cpp.

Первоначально я думал, что это связано с проблемой с пространством имен, но все файлы теперь находятся в одном пространстве имен. Я делаю что-то принципиально неправильное здесь?

+0

Это дубликат в миллион раз, но SO ужасен при нахождении вещей. Поиск тупых SO. – GManNickG

ответ

4

Определения шаблонов должны быть видимыми в момент создания экземпляра. То есть, она должна быть в заголовке как-то:

// one.hpp 

template <typename T> 
static void one(T& var) 
{ 
    // definition visible in header 
} 

Хотя я не знаю, почему вы хотите быть статичным.

+0

Конечно, да, я всегда смущаюсь этим. Я могу переслать объявить шаблонную функцию в один заголовок, если определение все еще доступно в другом файле заголовка. И вы правы, нет причин быть статичными в этом случае. – Dan

2

В дополнение к ответу GMan, я хотел бы отметить, что вы не можете сделать T& привязку к RValue такие как неотъемлемый буквального 5, который имеет тип int. 5 не будет связываться с int&, но привязывается к const int&.

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