0

次のコードは、警告なしで g++ (Debian) で正しくコンパイルされます。

#include <list>

template <typename T>
struct A
{
T a;
typedef T value_type;
};


template <typename T>
struct B
{
 typedef std::list < A <T> > Type;
};


template <typename Data>
void test ( Data d, typename Data::value_type::value_type b ) { }


int main(int argc, char* argv[])
{
B <double> ::Type b;
double c = 0.0;
test <typename B <double>::Type > (b, c);
return 0;
}

ただし、VS 2010 コンパイラを使用した後、次のエラーが発生しました。

Error   1   error C2770: invalid explicit template
argument(s) for 'void test(Data,Data::value_type::{ctor})

明示的な引数が正しくないのはなぜですか?

更新された質問

あなたのアドバイスが正しく理解されたかどうかはわかりません。このようなことを言いましたか?しかし、この構造は私には意味がありません。

template <typename Data>
void test ( Data d, typename identity <typename    Data::value_type>::type::value_type  b) { }
4

2 に答える 2

3

ここでの問題は、C++ 11 より前のドラフトにのみ存在し、基本クラスが typedef を介してのみ認識される場合に継承コンストラクターを機能させるために追加されたルールをコンパイラが実装していることです。次に、 usingusing TypedefName::TypedefName;宣言が基本クラスのコンストラクターを参照するようにします (この場合、パラメーターの型は のコンストラクターを誤って参照しますA <double>)。

問題は、この処理が using 宣言の外でもアクティブであるということでした。欠陥レポートが指摘した後、処理は宣言のみを使用するように削減されました。したがって、コードは正しく、コンパイラは間違っています。

于 2013-05-07T18:01:57.867 に答える
0

私はそれが古い投稿であることを知っていますが、それが誰かに役立つ場合に備えて(templateの2番目の引数の宣言にキーワードが追加されていることに注意してくださいtest():

#include <list>

template <typename T>
struct A
{
T a;
typedef T value_type;
};


template <typename T>
struct B
{
 typedef std::list < A <T> > Type;
};


template <typename Data>
void test ( Data d, typename Data::value_type::template value_type b ) { }


int main(int argc, char* argv[])
{
B <double> ::Type b;
double c = 0.0;
test <typename B <double>::Type > (b, c);
return 0;
}

これはVS 2010でコンパイルする必要があります

于 2013-07-24T11:22:29.273 に答える