2016-04-08 16 views
2

がコンパイルに失敗したテンプレートの休憩string_literals:エラーの場合はgccのバグの回避策:で使用してchrono_literals GCC 4.9.2次のコードで

error: no matching function for call to 'operator""s()' 

ありません:errorsを与える

#include <chrono> 
#include <string> 

using namespace std::literals::string_literals; 
using namespace std::literals::chrono_literals; 

template<typename T> 
struct S 
{ 
    S() 
    { 
     "hello"s; 
    } 
}; 

int main() 
{ 
    S<int> s; 
} 

で始まります私はchrono_literals行をコメントアウトし、テンプレートではないクラスについてはエラーを出力しません。


これはgCC 4.9のバグです.GCC 5とclangで同じコードが動作するためです。私の質問です:私は、このコンパイラのバージョンでは、テンプレートでstd :: stringリテラルとクロノリテラルの両方を使用できるように私は配置することができます回避策はありますか?

たとえば、標準ヘッダーのいずれかで編集できるもの、またはコード内でグローバルに行うことができるものはありますか?

注:このコンパイラのバージョンには、C++標準が規定しているように暗黙のうちにusing namespace std::literals::chrono_literalsが含まれていません。 GCC 5でも追加されました。

+0

あなたはトップレベルで 'using'を持っている必要がありますか?同じ機能で両方を使用する必要がありますか?同じ範囲? –

答えて

2

両方を同じスコープで使用する必要がない場合は、必要に応じてusingを使用してください。

そうでなければ、私は(あなたがとにかくについての警告を取得したい)sよりも別の何かをlibstdc++ headerに基づいて自分自身の文字列リテラルを再実装し、それらを呼びたい... _s言います。もちろん、自分でchrono literalsを実装することもできますが、それらはもう少し複雑なようです。

#include <string> 
#include <chrono> 


inline std::basic_string<char> 
operator""_s(const char* __str, size_t __len) 
{ return std::basic_string<char>{__str, __len}; } 


template<typename T> 
struct S 
{ 
    S() 
    { 
     { 
      using namespace std::literals::chrono_literals; 
      10s; 
      "hello"_s; 
     } 
     { 
      using namespace std::literals::string_literals; 
      "hello"s; 
     } 
    } 
}; 

int main() 
{ 
    S<int> s; 
} 

code on godbolt

関連する問題