Причина, по которой это работает для double
вектора, но не int
, забавна.Подпись для std::vector::resize
является void resize(size_type count, const value_type& value )
начиная с C ++ 11.Взятие ссылки на объект делает его ODR-используемым, и поэтому ваш статический член int
теперь должен быть определен где-то в вашем приложении.
Однако, когда вы std::vector<double>
, вы можете 'связать ссылку на объект.Вместо этого компилятор создает временный объект double
и привязывает ссылку к указанному временному объекту.Из-за этого вы избегаете использования ODR статического члена класса, так как создание временного double
не использует ODR, а временное использование ODR это нормально.
Исправление проблемы - тривиальноесли у вас есть файл .cpp для класса, в этом случае вы просто определяете свою статичность там.Однако для класса только с заголовком решение не является тривиальным до C ++ 17, где вы можете иметь встроенные переменные и иметь очень хорошее решение:
#include <vector>
class aClass
{
public:
static const int HALLO;
};
inline const int aClass::HALLO = -3;
int main()
{
std::vector<int> b;
b.resize(10,aClass::HALLO); //fine
return 0;
}