C ++ возвращаемые типы и имена типов

У меня есть следующий код:

#include <iostream>
#include <tuple>

struct H
{
static const int Index = 0;
};

struct V
{
static const int Index = 1;
};

struct Slice
{
Slice(): Value(5) { }

int Value;
};

class Dimension
{
public:

template<class D>
Slice& Slice() // causes compiler error
//::Slice& Slice() // compiles ok
{
return std::get<D::Index>(slices);
}

template<class D>
::Slice const& Slice() const
{
return std::get<D::Index>(slices);
}

private:

typedef std::tuple<::Slice, ::Slice> SlicesT;
SlicesT slices;
};int main(int, char*[])
{
Dimension d;

std::cout << d.Slice<V>().Value << std::endl;

d.Slice<V>().Value = 10; // error here

std::cout << d.Slice<V>().Value << std::endl;
}

Это дает эту ошибку в VS2012: error C3892: 'd' : you cannot assign to a variable that is const

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

1

Решение

clang дает гораздо более дружелюбное предупреждение:

main.cpp:33:5: error: must use 'struct' tag to refer to type 'Slice' in this scope
Slice const& Slice() const
^
struct
main.cpp:26:12: note: struct 'Slice' is hidden by a non-type declaration of 'Slice' here
Slice& Slice() // causes compiler error
^
1 error generated.

struct Slice или же ::Slice оба работают так, чтобы компилятор знал, что вы имеете в виду тип. На MSVC почему-то struct Slice не работает, поэтому вы должны использовать оператор разрешения области.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]