0

以下は g++ でコンパイルされますが、Visual C++ (Visual Studio Express 2012) ではコンパイルされません。なんで?

(たとえば、 )foo以外の型で呼び出した場合、その場合は意味がないため、これが壊れることが予想されます。しかし、型だけで呼び出すつもりなら、うまくいくはずです。実際、VC++ では、まったく呼び出さなくてもコンパイルは失敗します。intdoubleB<double>::bbb:aaafoointfoo

struct A {
    typedef int aaa;
};

template <typename T>
struct B {
    typedef void bbb;
};

template <>
struct B<int> {
    typedef A bbb;
};

template <typename T>
typename B<T>::bbb::aaa // line 16
foo(const T &arg) {     // line 17
    return typename B<T>::bbb::aaa();
}

int main() {
    // Compilation fails with or without the following two lines.
    //int x = 0;
    //foo(x);
}

これが私が得るエラーメッセージです:

gcc_vs_vs.cc(16) : error C2510: 'bbb' : left of '::' must be a class/struct/union
gcc_vs_vs.cc(17) : error C2146: syntax error : missing ';' before identifier 'foo'
gcc_vs_vs.cc(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
gcc_vs_vs.cc(17) : error C2143: syntax error : missing ',' before '&'
4

0 に答える 0