Vinod
Vinod

Reputation: 1053

Compilation errors related to template instantiation

The following test program reproduces compilation errors within the context of a larger program:

#include <algorithm>
#include <iostream>
#include <vector>
using std::for_each;
using std::vector;
using std::cout;
using std::endl;

template<typename T, typename C = vector<T>>
class display_container{
    public:
        display_container(const C& cr):this->cr(cr){this->();}
        ~display_container(){}
    private:
        constexpr void operator () (void){if(cr.empty()){cout << "NULL" << " ";} else{for_each(cr.begin(), cr.end(), [](const T& crt){cout << crt << " ";});}}
        const C& cr;
};

int main (void){

    int n = 5;
    vector<int> vec(n, 0);
    display_container d(vec);
    cout << endl;

    return 0;
}

The following is a log of the compiler errors:

g++ -ggdb -std=c++17 -Wall -Werror=pedantic -Wextra  -c code.cpp
code.cpp: In constructor ‘display_container<T, C>::display_container(const C&)’:
code.cpp:12:40: error: expected identifier before ‘this’
         display_container(const C& cr):this->cr(cr){this->();}
                                        ^~~~
code.cpp:12:40: error: expected ‘{’ before ‘this’
code.cpp: In function ‘int main()’:
code.cpp:23:28: error: class template argument deduction failed:
     display_container d(vec);
                            ^
code.cpp:23:28: error: no matching function for call to ‘display_container(std::vector<int>&)’
code.cpp:12:9: note: candidate: template<class T, class C> display_container(const C&)-> display_container<T, C>
         display_container(const C& cr):this->cr(cr){this->();}
         ^~~~~~~~~~~~~~~~~
code.cpp:12:9: note:   template argument deduction/substitution failed:
code.cpp:23:28: note:   couldn't deduce template parameter ‘T’
     display_container d(vec);
                            ^
code.cpp:10:7: note: candidate: template<class T, class C> display_container(display_container<T, C>)-> display_container<T, C>
 class display_container{
       ^~~~~~~~~~~~~~~~~
code.cpp:10:7: note:   template argument deduction/substitution failed:
code.cpp:23:28: note:   ‘std::vector<int>’ is not derived from ‘display_container<T, C>’
     display_container d(vec);
                            ^
make: *** [makefile:20: code.o] Error 1

I presume that the remaining errors trickle down from the first error related to the inline constructor definition for the display_container template class.

Any suggestions on what is wrong with the code related to inline constructor definition?

TIA

Upvotes: 2

Views: 74

Answers (2)

songyuanyao
songyuanyao

Reputation: 172894

  1. You couldn't (and don't need) qualify data members in member initializer list by this, they're expected to be the identifier. The correct syntax should be

    display_container(const C& cr):cr(cr){(*this)();}
    
  2. You should dereference on this and then call operator() on it (as showed abolve), or you can call operator() explicitly like this->operator()(); (which looks ugly).

  3. You should specify the template argument for display_container.

    display_container<int> d(vec);
    

LIVE

Upvotes: 1

Alphastrick
Alphastrick

Reputation: 131

The compiler can not fetch the template type of vector yet:

#include <algorithm>
#include <iostream>
#include <vector>

using std::for_each;
using std::vector;
using std::cout;
using std::endl;

template<typename T, typename C = vector<T>>
class display_container{
    public:
        display_container(const C& cr): cr(cr) { (*this)(); }
        ~display_container(){}
    private:
        constexpr void operator () (void){if(cr.empty()){cout << "NULL" << " ";} else{for_each(cr.begin(), cr.end(), [](const T& crt){cout << crt << " ";});}}
        const C& cr;
};

int main (void){

    int n = 5;
    vector<int> vec(n, 0);
    display_container<int> d(vec);
    cout << endl;

    return 0;
}

Upvotes: 2

Related Questions