繁体   English   中英

为什么我不能在声明行调用模板类的 function?

[英]Why can't I call template class's function in declaration line?

在我的 class 分配中,我在模板 class 的声明行中调用了 function。

测试.h

template <typename T, char N, char C, typename K>
class MyClass
{
    public:
    static const char* Get()
    {
    }
};

template <char N, char C>
class MyClass<std::string, N, C, char>
{
    private:
        std::string x;
    public:
    
    void setX(size_t t){
        x.resize(t);
    }
    
    void operator()(std::string y){
        setX(y.size());
        for (std::string::size_type i = 0; i < y.size(); i++) {
            x[i] = y[i];
        }
    }
    
    void print(){
        for(int i = 0; i < x.size(); i++){
            std::cout << x[i];
        }
    }
};

测试.cpp

int main(){
    std::stringstream ss;
    ss << "Hello";
    MyClass<std::string, ' ', '*', char> tn( ss.str() ); <---- "This is where I got the error"
    tn.print();
};

我得到了一个不匹配的 function 调用错误,但如果我像下面那样做,我没有错误:

int main(){
    std::stringstream ss;
    ss << "Hello";
    MyClass<std::string, ' ', '*', char> tn;
    tn( ss.str() );
    tn.print();
};

编辑:这是完整的错误 output:

test.cpp: In function 'int main()':
test.cpp:15:52: error: no matching function for call to 'MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(std::__cxx11::basic_stringstream<char>::__string_type)'
  MyClass<std::string, ' ', '*', char> tn( ss.str() );
                                                    ^
In file included from test.cpp:4:0:
test.h:17:7: note: candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass()
 class MyClass<std::string, N, C, char>
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.h:17:7: note:   candidate expects 0 arguments, 1 provided
test.h:17:7: note: candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(const MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&)
test.h:17:7: note:   no known conversion for argument 1 from 'std::__cxx11::basic_stringstream<char>::__string_type {aka std::__cxx11::basic_string<char>}' to 'const MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&'
test.h:17:7: note: candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&&)
test.h:17:7: note:   no known conversion for argument 1 from 'std::__cxx11::basic_stringstream<char>::__string_type {aka std::__cxx11::basic_string<char>}' to 'MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&&'

该错误与模板无关。 如果MyClass不是模板,你会得到同样的错误。 这个

MyClass<std::string, ' ', '*', char> tn( ss.str() );

调用构造函数。 MyClass<std::string,' ','*',char>没有匹配的构造函数,因此出现错误。

这适用于临时工:

MyClass<std::string, ' ', '*', char>{}.operator()( ss.str() );

如果你想在一行中压缩所有内容,你可以让operator()返回对*this的引用。 但是,通过将所有内容压缩在一行代码中并不会变得更易读。


PS:错误中提到的方法,例如这里:

 candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass()

不是MyClass::operator() 它是构造函数。 如果您无法修改main ,则需要提供一个将字符串作为参数的构造函数。 这就是编译器在这里抱怨时要寻找的内容:

test.cpp:15:52: error: no matching function for call to 'MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(std::__cxx11::basic_stringstream<char>::__string_type)'
  MyClass<std::string, ' ', '*', char> tn( ss.str() );
                                                    ^

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM