Вот компилируемый образец, который я сшивал из нескольких файлов заголовков. Код не будет иметь смысла, потому что я уничтожил все несущественные части, но суть в том, что я реализую метод прокси-сервера Scott Meyers (упомянутый here), хотя он превратился в более оболочку, чем временный прокси. Ничто из этого не имеет значения, хотя мой вопрос, по-видимому, является чисто различием в поведении компилятора.Почему это не компилируется в VS Express 2013, хотя он компилируется в MinGW?
#include <iostream>
#include <vector>
template<typename T>
class Proxy
{
public:
enum class State
{
NEVER_SET = 0,
SET,
UNSET
};
operator const T&() const
{
if (_state != State::SET)
{
std::cout << "EXCEPTION" << std::endl;
// TODO throw exception
}
return _data;
}
Proxy<T>& operator=(const T& val)
{
_data = val;
_state = State::SET;
return (*this);
}
Proxy<T>& operator+=(const T& val)
{
_data = (*this) + val;
_state = State::SET;
return (*this);
}
private:
T _data;
State _state = State::NEVER_SET;
};
class Tape
{
};
template<typename T>
class tape : public Tape
{
public:
const Proxy<T>& operator[](int idx) const
{
return operator[](idx);
}
Proxy<T>& operator[](int idx)
{
if (idx >= data.size())
{
data.resize(idx + 1);
}
return data[idx];
}
private:
std::vector< Proxy<T> > data;
};
class CRIXUS
{
public:
virtual void Go() final {};
protected:
virtual void Pre() {};
virtual void Post() {};
virtual void Step() = 0;
};
class CRIXUS_MA : public CRIXUS
{
public:
int window = 30;
tape<double> input;
tape<double> output;
protected:
virtual void Step()
{
double sum = 0;
for (int j = 0; j < window; j++)
{
sum += input[-j];
}
output[0] = sum/window;
}
};
int main()
{
}
Он отлично компилируется на Ideone, а также через Jetbrain в CLion (Toolchain: MinGW 3.20 CMake 2.8.12.2):
Однако он не будет компилировать на VS Express, 2013:
Запуск полный код из CLion (который включает в себя чтение CSV-файл NUM и вывод скользящего среднего), я могу проверить правильность вывода. Просто VS не будет компилировать код.
Насколько я могу судить, оператор приведения
operator const T&() const
{
if (_state != State::SET)
{
std::cout << "EXCEPTION" << std::endl;
// TODO throw exception
}
return _data;
}
должен преобразовать Proxy<T>
в T
, т.е.Proxy<double>
к double
. И когда я принудительно лишаю линию нарушения,
sum += (double)input[-j];
это прекрасно работает. Есть идеи?
Какая линия линии 86? –
Agh, извините. Это 'sum + = input [-j];'.Там 'input [-j]' должен возвращать 'Proxy', но поскольку 'sum' является' double', я ожидаю, что произойдет конверсия. –
Можете ли вы привести к минимальному примеру? (вытащите столько, сколько сможете, но все еще есть проблема) –