我有以下代码:
#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
我可以通过限定第一个函数返回类型来修复它(如注释掉的行)。但我真的不明白这里发生了什么。这是编译器错误还是真正危险的代码?
答案 0 :(得分:3)
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
不起作用,因此您必须使用范围解析运算符。