Community
cancel
Showing results for 
Search instead for 
Did you mean: 
chkone
Beginner
876 Views

Intel C++ 14 - error : function "..." is not a type name

Hello,

I do some experiment with constexpr, I saw some error:

Minimal code, for reproduction:

#include <iostream>

template < typename Type >
struct A
{
    static constexpr Type Func0() { return static_cast< Type >( 0.f ); }
    static constexpr Type Func1() { return static_cast< Type >( 1.f ); }
};

template < typename Type >
struct Object
{
    constexpr Object( Type const _a, Type const _b ) :
        a( _a ),
        b( _b )
    {}

private:
    Type a;
    Type b;
};

template < typename Type >
struct Const
{
    static constexpr Type            Func0Value = A< Type >::Func0();
    static constexpr Type            Func1Value = A< Type >::Func1();
    static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type >::Func1() );
};

int main()
{
    std::cout << Const< int >::Func0Value << std::endl;
    std::cout << Const< int >::Func1Value << std::endl;
    std::cout << Const< float >::Func1Value << std::endl;

    return 0;
}

Error:

1>main.cpp(28): error : function "A<Type>::Func0 [with Type=int]" is not a type name
1>        static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type >::Func1() );
1>                                                     ^
1>            detected during instantiation of class "Const<Type> [with Type=int]" at line 33
1>  
1>main.cpp(28): error : function "A<Type>::Func1 [with Type=int]" is not a type name
1>        static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type >::Func1() );
1>                                                                         ^
1>            detected during instantiation of class "Const<Type> [with Type=int]" at line 33
1>  
1>main.cpp(28): error : function "A<Type>::Func0 [with Type=float]" is not a type name
1>        static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type >::Func1() );
1>                                                     ^
1>            detected during instantiation of class "Const<Type> [with Type=float]" at line 35
1>  
1>main.cpp(28): error : function "A<Type>::Func1 [with Type=float]" is not a type name
1>        static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type >::Func1() );
1>                                                                         ^
1>            detected during instantiation of class "Const<Type> [with Type=float]" at line 35
1>  
1>  compilation aborted for main.cpp (code 2)

Version of compiler:

Intel® C++ Composer XE 2013 SP1 Update 1 Integration for Microsoft* Visual Studio* 2012, Version 14.0.1278.11

I know en C++03 is not possible to instanciate non-integral object like that. But I would like to know if it is possible with C++11. For me everything is "parsable" at the compilation time.

The question: It is a C++11 limitation OR Compiler issue?

Thanks

0 Kudos
5 Replies
SKost
Valued Contributor II
876 Views

Could you try to change: ... template < typename Type > struct Const { ... to ... template < typename Type > struct TConst { ...
Judith_W_Intel
Employee
876 Views

You are not using correct syntax for initializing a static data member.

The GNU compiler gives similar errors, i.e.:

sptxl8-72> g++48 -std=c++11 -c ex2.cpp
ex2.cpp:28:61: error: A<Type>::Func0 is not a type
     static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type >::Func1() );
                                                             ^
ex2.cpp:28:81: error: A<Type>::Func1 is not a type
     static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type >::Func1() );
                                                                                 ^

The initialization needs to be done with this syntax:

#ifdef OK  // valid
    static constexpr Object< Type >    myObject = Object<Type>( A< Type
>::Func0(), A< Type >::Func1() );
#else // not valid
    static constexpr Object< Type >    myObject( A< Type >::Func0(), A< Type
>::Func1() );
#endif

Unfortunately the above does not work with our 14.0 compiler (an error
message about "expression must have a constant value" will occur).
But it will compile with GNU and it works with our development compiler
which will become our next compiler release.

Judy

 

SKost
Valued Contributor II
876 Views

>>You are not using correct syntax for initializing a static data member. >> >>The GNU compiler gives similar errors, i.e.: >> >>sptxl8-72> g++48 -std=c++11 -c ex2.cpp >>ex2.cpp:28:61: error: A::Func0 is not a type >> static constexpr Object< Type > myObject( A< Type >::Func0(), A< Type >::Func1() ); >> ^ >>ex2.cpp:28:81: error: A::Func1 is not a type >> static constexpr Object< Type > myObject( A< Type >::Func0(), A< Type >::Func1() ); Just for verification I've also reproduced the problem with MinGW version 4.8.1 ( 32-bit ) on a Windows platform.
SKost
Valued Contributor II
876 Views

>>...Just for verification I've also reproduced the problem with MinGW version 4.8.1 ( 32-bit ) on a Windows platform. Suggested Judith's fix is working. Thanks.
SKost
Valued Contributor II
876 Views

Output of the test-case after Judith's correction is: 0 1 1