2017-03-25 11 views
1

ラムダ関数にしたい静的メンバー変数を持つテンプレートクラスがあります。それはなぜ機能しないのですか?静的メンバー変数にラムダ関数を割り当てる(C++)

#include <iostream> 
using namespace std; 

template <typename T> 
class Test { 
public: 
    static constexpr auto lambda = [](T val) -> T { 
     return val; 
    }; 
}; 

int main() { 
    cout << Test<int>::lambda(123) << endl; 
} 

constexprとconstの両方のバージョンを試しましたが、

Iを得る最初のケースで

:第2のケースで

../src/test.cpp:8:24: error: ‘constexpr const Test<int>::<lambda(int)> Test<int>::lambda’, declared using local type ‘const Test<int>::<lambda(int)>’, is used but never defined [-fpermissive] 
    static constexpr auto lambda = [](T val) -> T { 
         ^~~~~~ 

../src/test.cpp:7:20: error: ‘constexpr’ needed for in-class initialization of static data member ‘const Test<int>::<lambda(int)> Test<int>::lambda’ of non-integral type [-fpermissive] 
    static const auto lambda = [](T val) -> T { 
        ^~~~~~ 
../src/test.cpp:7:20: error: ‘const Test<int>::<lambda(int)> Test<int>::lambda’, declared using local type ‘const Test<int>::<lambda(int)>’, is used but never defined [-fpermissive] 
+0

第一の場合は、C++ 17で正常に動作します。 – songyuanyao

+0

ありがとう!私は回避策を見つけるでしょう。 – biowep

+0

単に静的関数を使用するのはなぜですか? ...すべての後、 'Test'のそれぞれのインスタンス化ごとに異なるものがあります。 – WhiZTiM

答えて

1

コア定数式のみがC++ 17から出発ラムダを含んでいてもよい(cppreference point 8を参照)。これはproposal N24487で、P0170R0としてC++ 17に入っています。

あなたは、静的なラムダを使用する必要がある場合、あなたはconstruct at first use idiomを利用することができます:

#include <iostream> 

template <typename T> 
class Test { 
public: 
    std::function<T(T)> createLambda() { 
     static const std::function<T(T)> returnLambda = [](T val) -> T { 
      return val; 
     }; 
     return returnLambda; 
    } 
}; 

int main() { 
    Test<int> lambdaFactory; 
    std::function<int(int)> n = lambdaFactory.createLambda(); 
    std::cout << n(123) << std::endl; 
} 
+1

C++ 14で返される戻り値の型がある場合は、おそらく 'std :: function'ラッパーを取り除くことができます。 –

関連する問題