【发布时间】:2014-06-03 15:20:28
【问题描述】:
我正在使用 clang++-3.4 进行 C++11 项目,并决定使用 g++-4.8.2 进行编译,以防产生的错误有任何差异。原来g++拒绝了clang++接受的一些代码。我已将问题简化为下面给出的 MWE。
enum { a };
template <class T>
struct foo
{
static constexpr auto value = a;
};
int main()
{
static constexpr auto r = foo<int>::value;
}
foo.cpp:5:23: 错误:'
const<anonymous enum> foo<int>::value',使用匿名类型声明,已使用但从未定义 [-fpermissive]static const auto value = A;
我需要一些帮助来回答以下两个问题:
-
哪个编译器对标准的解释是正确的?我假设一个编译器在接受或拒绝代码方面是正确的,而另一个是错误的。
-
我该如何解决这个问题?我无法命名匿名枚举,因为它来自第三方库(在我的例子中,枚举是
Eigen::RowMajor和Eigen::ColMajor)。
【问题讨论】:
-
你定义了变量吗?或者错误信息是什么?
-
@Arcoth 我认为他没有提供定义,如果你这样做,错误就会消失。 Here's 错误消息。我认为问题是提及
foo<T>::value是否构成odr 使用。 gcc 似乎认为是,而 clang 认为不是。 -
@Praetorian 是的,抱歉,我愚蠢地忘记包含实际的错误消息。
标签: c++ c++11 enums language-lawyer auto