Intel® C++ Compiler
Community support and assistance for creating C++ code that runs on platforms based on Intel® processors.
Announcements
The Intel sign-in experience has changed to support enhanced security controls. If you sign in, click here for more information.
7781 Discussions

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

chkone
Beginner
3,034 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,034 Views
Could you try to change: ... template < typename Type > struct Const { ... to ... template < typename Type > struct TConst { ...
Judith_W_Intel
Employee
3,034 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

 

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