1

我有以下代码:

#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

我可以通过限定第一个函数返回类型(如注释掉的行)来修复它。但我真的不明白这里发生了什么。这是编译器错误还是真正危险的代码?

4

1 回答 1

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它不起作用,因此您必须使用范围解析运算符。

于 2014-03-05T09:12:36.173 回答