CRTP编译错误

时间:2016-03-02 17:18:39

标签: c++ templates c++11 constexpr crtp

以下内容将使用GCC 5.2进行编译,但不能使用Visual Studio 2015进行编译。

template <typename Derived>
struct CRTP {
    static constexpr int num = Derived::value + 1;
};

struct A : CRTP<A> {
    static constexpr int value = 5;
};

它抱怨A没有名为value的成员。 如何修复代码以便在两个编译器上编译?或者完全是非法的?

2 个答案:

答案 0 :(得分:6)

尝试使其成为constexpr功能。您现在设置它的方式是尝试访问不完整的类型 由于模板化成员函数仅在首次使用时初始化,因此该点将完全定义类型A

#include <iostream>

template <typename Derived>
struct CRTP {
    static constexpr int num() { return  Derived::value + 1; }
};

struct A : CRTP<A> {
    static constexpr int value = 5;
};

int main()
{
    std::cout << A::num();
    return 0;
}

直播here

答案 1 :(得分:4)

问题在于:

$('#thumbs-down').replaceWith("<%= j render comment.get_downvotes.size %>");

template <typename Derived> struct CRTP { static constexpr int num = Derived::value + 1; ↑↑↑↑↑↑↑↑↑ }; 实例化时,CRTP<A>还不是一个完整的类,因此您无法实际访问它的静态成员。

一种解决方法是将A作为单独的模板参数传递:

num