带引用和静态类成员的奇怪案例

时间:2013-06-30 16:45:53

标签: c++ template-meta-programming

采取以下代码:

#include <type_traits>
#include <iostream>

template <class T>
void print(T &&t){
    std::cout << t << std::endl;
}

template<class T, T val>
struct Foo{
    static constexpr T value = val;
};

int main(){
    print(Foo<int, 123>::value);
}

它拒绝在Clang 3.3和GCC 4.8.1 ("undefined reference to Foo<int, 123>::value")下编译,这让我感到困惑,因为Foostd::integral_constant完全相同,并且相同的代码与{{{ 1}}。它也在打印功能中使用普通左值引用失败。关于这种行为的任何解释?

这个极小的例子也出现了这个问题:

integral_constant

1 个答案:

答案 0 :(得分:4)

正如编译器所说,没有对静态变量的引用,你必须添加

template<class T, T val>
constexpr T Foo<T, val>::value;

定义类Foo后

相关问题