我正在尝试使用默认原始指针作为默认模板参数。我读到非类型模板参数仅限于整数类型、枚举、指针和引用。使用引用我没有问题,但是当我尝试使用指针时,我遇到了这样的错误:

error: non-type template argument of type 'Engine *' is not a constant expression.

这是我的代码:

#include <iostream>
#include <memory>

using std::cout;
using std::endl;

class Engine
{
public:
    void startEngine()
    {
        m_started = true;
        cout << "Engine started!" << endl;
    }
private:
    bool m_started = false;
};

template<typename T, T* DEFAULT>
class Car
{
public:
    explicit Car(const uint64_t uid) : m_uid(uid), engine(DEFAULT)
    {
        engine->startEngine();
    }

private:
    uint64_t m_uid;
    T* engine;
};

namespace
{
    std::shared_ptr<Engine> engine = std::make_shared<Engine>();
    Engine* e = engine.get();
}

int main()
{
    Car<Engine, e> lambo(0);
    return 0;
}

我现在看到的唯一限制是第二个模板参数需要具有静态存储持续时间和外部或内部链接,但代码符合这些要求。感谢任何帮助。

最佳答案

非类型模板参数必须是常量表达式:



也许您可以解决此问题,使您指向的对象具有静态存储持续时间和链接( see ):



例子:

namespace{
    Engine e;
}

int main(){
    Car<Engine, &e> lambo(0);
    return 0;
}

关于c++ - 不能使用指针作为默认模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57807312/

10-13 08:26