1
typedef std::chrono::duration<int, std::ratio_multiply<std::ratio<12, 34>, std::ratio<9>>> irrelevant;

void func(irrelevant){} //  comment this out to make it work
void func(std::chrono::seconds){}
void func(std::chrono::minutes){}

int main()
{
    func(std::chrono::seconds(43));
}

上記のように、原因となるオーバーロードを含めると、irrelevant次のような一連のエラーが発生します。

'std :: ratio_divide <_R1、_R2>::type'は'std:: ratio_divide <_R1、_R2>'の基本クラスのメンバーではありません

実際に何か問題がありますか、それともVS2012のせいですか?どうすれば回避できますか?

4

1 に答える 1

4

VS2012にアクセスできませんが、これが機能するかどうかを確認してください。

typedef std::chrono::duration<int, std::ratio_multiply<std::ratio<12, 34>, std::ratio<9> >::type> irrelevant;

あなたのコードはC++11モードでコンパイルされますが、C ++ 03モード(clang / libc ++)ではコンパイルされません。私の理論では、VS2012はまだテンプレートエイリアスを実装していないか、実装している場合は、<chrono>テンプレートエイリアスの可用性にまだ反応していません。フォールバックとして、ジョブを実行する必要がratio_multiplyあるネストされたタイプがあります。type

于 2012-08-04T17:07:53.020 に答える