C++ CRTP的各种错误(C+;+;)

C++ CRTP的各种错误(C+;+;),c++,crtp,C++,Crtp,我知道我刚才问了一个问题,但我不知道我做错了什么。我只重写了一小部分,找不到任何错误(用作参考) 我的代码: #include <iostream> #include <stdlib.h> #include <cstring> using namespace std; template<class Derived> class Entity { private: string _name; public:

我知道我刚才问了一个问题,但我不知道我做错了什么。我只重写了一小部分,找不到任何错误(用作参考)

我的代码:

#include <iostream>
#include <stdlib.h>
#include <cstring>

using namespace std;

template<class Derived>
class Entity {
    private:
        string _name;
    public:
        const string& name() const;
        Derived& name( const string& );
        Derived* This() { return static_cast<Derived*>(this); }
};

class Client : Entity<Client> {
    private:
        long int _range;
    public:
        const long int& range() const;
        Client& range( const long int& );
};

const string& Entity::name() const {
    return _name;
}

Derived& Entity::name(const string& name) {
    _name = name;
    return *This();
}

const long int& Client::range() const {
    return _range;
}

Client& Client::range( const long int& range ) {
    _range = range;
    return *this;
}

int main() {
    Client ().name("Buck").range(50);
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
模板
类实体{
私人:
字符串\u名称;
公众:
常量字符串&name()常量;
派生名称(常量字符串&);
派生的*This(){return static_cast(This);}
};
类客户端:实体{
私人:
长整数范围;
公众:
常量long int&range()常量;
客户和范围(常量长整数和);
};
常量字符串和实体::name()常量{
返回_name;
}
派生实体::名称(常量字符串和名称){
_名称=名称;
返回*This();
}
常量long int&客户端::range()常量{
返回范围;
}
客户端和客户端::范围(常量长整型和范围){
_范围=范围;
归还*这个;
}
int main(){
客户().名称(“美元”).范围(50);
返回0;
}
结果是:

untitled:25:错误:“模板类实体”未使用模板参数
无标题:25:错误:非成员函数“const std::string&name()”不能具有cv限定符
无标题:在函数“const std::string&name()”中:
untitled:26:错误:“\u name”未在此作用域中声明
无标题:在全球范围内:
untitled:29:错误:在“&”标记之前需要构造函数、析构函数或类型转换
无标题:在函数“int main()”中:
未命名:13:错误:“派生的&实体::名称(const std::string&)[with-Derived=Client]”不可访问
无标题:44:错误:在此上下文中
未命名:44:错误:“实体”不是“客户端”的可访问基础

我非常感谢您的回答(我的无能可能是由于睡眠不足所致:d)

您需要实现以下专门功能:

template<>
const string& Entity<Client>::name() const {
    return _name;
}

template<>
Client& Entity<Client>::name(const string& name) {
    _name = name;
    return *This();
}

您需要实现以下专门功能:

template<>
const string& Entity<Client>::name() const {
    return _name;
}

template<>
Client& Entity<Client>::name(const string& name) {
    _name = name;
    return *This();
}

如果在模板定义之外定义类模板的成员,则需要包含模板规范:

template <class Derived>
const string& Entity<Derived>::name() const {
    return _name;
}

template <class Derived>
Derived& Entity<Derived>::name(const string& name) {
    _name = name;
    return *This();
}

如果在模板定义之外定义类模板的成员,则需要包含模板规范:

template <class Derived>
const string& Entity<Derived>::name() const {
    return _name;
}

template <class Derived>
Derived& Entity<Derived>::name(const string& name) {
    _name = name;
    return *This();
}

非常感谢,现在开始编译。这只会为
客户机创建专业化
;你可能想定义泛型函数,假设你想从
实体
@MikeSeymour继承多个类,我添加了泛型实现。非常感谢,现在编译。这只会为
客户端
创建专门化;你可能想定义泛型函数,假设你想从
实体
@MikeSeymour继承多个类,我添加了泛型实现。如果不是很长,你应该直接把代码放在问题中。如果不是很长,你应该直接把代码放在问题中。
class Client : public Entity<Client> {
    // stuff
};