C++ 与模板实例化相关的编译错误

C++ 与模板实例化相关的编译错误,c++,templates,compiler-errors,C++,Templates,Compiler Errors,以下测试程序在较大程序的上下文中复制编译错误: #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_con

以下测试程序在较大程序的上下文中复制编译错误:

#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;
}
#包括
#包括
#包括
使用std::for_;
使用std::vector;
使用std::cout;
使用std::endl;
模板
类显示容器{
公众:
显示容器(const C&cr):this->cr(cr){this->();}
~display_container(){}
私人:
constexpr void操作符()(void){if(cr.empty()){cout();}
^~~~~~~~~~~~~~~~~
代码.cpp:12:9:注意:模板参数扣除/替换失败:
code.cpp:23:28:注意:无法推断模板参数't'
显示容器d(vec);
^
代码.cpp:10:7:注:候选:模板显示\u容器(显示\u容器)->显示\u容器
类显示容器{
^~~~~~~~~~~~~~~~~
代码.cpp:10:7:注意:模板参数扣除/替换失败:
code.cpp:23:28:注意:“std::vector”不是从“display\u container”派生的
显示容器d(vec);
^
make:**[makefile:20:code.o]错误1
我假定剩余的错误是从与
display\u容器
template类的内联构造函数定义相关的第一个错误开始的

关于内联构造函数定义相关的代码有什么问题吗

短暂性脑缺血发作

  • 您不能(也不需要)通过
    限定中的数据成员,它们应该是标识符。正确的语法应该是

    display_container(const C& cr):cr(cr){(*this)();}
    
  • 您应该取消对
    的引用,然后对其调用
    操作符()
    (如图所示),或者您可以显式地调用
    操作符()
    ,就像
    此->操作符();
    (看起来很难看)

  • 您应该为
    display\u container
    指定模板参数

    display_container<int> d(vec);
    
    显示容器d(vec);
    

  • 编译器尚无法获取向量的模板类型:

    #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;
    }
    
    #包括
    #包括
    #包括
    使用std::for_;
    使用std::vector;
    使用std::cout;
    使用std::endl;
    模板
    类显示容器{
    公众:
    显示容器(const C&cr):cr(cr){(*this)(;}
    ~display_container(){}
    私人:
    constexpr void操作符()(void){if(cr.empty()){cout
    
    #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;
    }