Why code using local struct as parameter for STL function does not compile in g++?

后端 未结 2 2087
[愿得一人]
[愿得一人] 2021-02-20 09:47

I have such code which works well:

#include 
#include 

char x[11]= \"ABCDEFGHIJ\";
char y[11];

struct F {
    char operator ()         


        
相关标签:
2条回答
  • 2021-02-20 10:07

    g++ 4.5.1 compiles your code (with -std=c++0x option).

    Your second code sample is ill-formed in C++031 but valid in C++0x

    std::transform is

    template < class InputIterator, class OutputIterator, class UnaryOperator >
      OutputIterator transform ( InputIterator first1, InputIterator last1,
                                 OutputIterator result, UnaryOperator op );
    

    However g++ 4.4 doesn't support local types as template arguments (even with -std=c++0x option] so you get an error.

    1 : A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter. (ISO C++03 §14.3.1.2)

    0 讨论(0)
  • 2021-02-20 10:11

    In C++-98/03 the second code is not valid, since F is a local type; in facts, at §14.3.1.2 it's stated that

    A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.

    [Example:

    template <class T> class X { /* ... */ };
    void f()
    {
        struct S { /* ... */ };
        X<S> x3;         // error: local type used as template-argument
        X<S*> x4;        // error: pointer to local type used as template-argument
    }
    

    —end example] [Note: a template type argument may be an incomplete type (3.9). ]

    In C++-0x this limitation is removed; in the same section, the new standard draft (N3126) explicitly shows this in the example:

    [ Example:

    template <class T> class X { };
    template <class T> void f(T t) { }
    struct { } unnamed_obj;
    
    void f() {
        struct A { };
        enum { e1 };
        typedef struct { } B;
        B b;
        X<A> x1;             // OK
        X<A*> x2;            // OK
        X<B> x3;             // OK
        f(e1);               // OK
        f(unnamed_obj);      // OK
        f(b);                // OK
    }
    

    — end example ] [ Note: a template type argument may be an incomplete type (3.9). — end note ]

    0 讨论(0)
提交回复
热议问题