Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Typename and Struct definition in C++98

There is a problem with usage of typenames with struct in the old C++ standard. I have the following error:

error: no matching function for call to

This is what I get when compiling with C++98 standard. With C++11 and newer, it works as I expect.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I defined a struct with a template and in the main() function I initialized the Pair from my templated struct with some values. Then I print the members of the struct:

#include <iostream>

template <typename T>
struct Pair
{
    T first = 0;
    T second = 0;
};

int main()
{
    Pair<int> p1 { 5, 6 };        
    std::cout << p1.first << ' ' << p1.second << '\n';

    p1 = { 2, 3 }; 
    std::cout << p1.first << ' ' << p1.second << '\n';


    return 0;
}

GDB Compiler tells me:
main.cpp: In function ‘int main()’: main.cpp:12:25: error: no matching function for call to ‘Pair::Pair()’ 12 | Pair<int> p1 { 5, 6 };

But if we change declaration of members in the struct to this:

struct Pair
{
    T first;
    T second;
};

It works correctly.

Can somebody explain why it works like this?

>Solution :

Default member initializers were a feature added to the language in C++11. That means that the = 0 part of your Pair member declarations is ill-formed before C++11.

Uniform initialization syntax was also added in C++11, which means that Pair<int> p1 { 5, 6 } and p1 = { 2, 3 } are also ill-formed prior to C++11.

Changing the definition of Pair as you did fixes the first issue, but not the second. To get the same functionality with C++98 you will need to add user-defined constructors to Pair:

template <typename T>
struct Pair
{
    T first;
    T second;

    Pair() : first(), second() {}
    Pair(T f, T s) : first(f), second(s) {}
};

int main()
{
    Pair<int> p1(5, 6);
    std::cout << p1.first << ' ' << p1.second << '\n';

    p1 = Pair<int>(2, 3);
    std::cout << p1.first << ' ' << p1.second << '\n';


    return 0;
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading