Intel® C++ Compiler
Community support and assistance for creating C++ code that runs on platforms based on Intel® processors.
7956 Discussions

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

chkone
Beginner
3,861 Views

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
SergeyKostrov
Valued Contributor II
3,861 Views
Could you try to change: ... template < typename Type > struct Const { ... to ... template < typename Type > struct TConst { ...
0 Kudos
Judith_W_Intel
Employee
3,861 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

 

0 Kudos
SergeyKostrov
Valued Contributor II
3,861 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.
0 Kudos
SergeyKostrov
Valued Contributor II
3,861 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.
0 Kudos
SergeyKostrov
Valued Contributor II
3,861 Views
Output of the test-case after Judith's correction is: 0 1 1
0 Kudos
Reply