2013-06-30 6 views
11
ile Meraklı vaka

aşağıdaki kod parçasını atın:referanslar ve statik sınıf üyeleri

Bu Foo tam olarak aynısını yapar çünkü Kafamı kurcalayan Clang 3.3 ve GCC 4.8.1 ("undefined reference to Foo<int, 123>::value") altında derlemeye reddeder
#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); 
} 

std::integral_constant ve aynı kod integral_constant ile düzgün çalışır. Yazdırma işlevinde düz lvalue referansı ile de başarısız olur. Bu davranışla ilgili herhangi bir açıklama var mı?

sorunu da bu oldukça az örnekle mevcuttur: derleyici diyor

template<class T> 
struct Bar{ 
    static const bool value = true; 
}; 
+3

Örneğiniz, derhal çalışır ve çalışır [on()] (http://ideone.com/BJLEuL). Belki bir derleyici sorunu? – djf

+0

Derleyici sürümlerinde düzenledim; Ideone muhtemelen büyük şeyler kullanır. –

+0

Şimdi bu oldukça ilginç: http://www.compileonline.com hatayı atıyor ama Ideone gibi gcc 4.7.2'ye sahip. –

cevap

4

gibi, statik değişkene bir atıf yoktur, sen tanımına sonra

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

eklemelisiniz Foo

+0

Teşekkürler, bu yeterince iyi bir çözüm gibi görünüyor. –