C ++ const成员函数,非类型模板和外部符号

时间:2016-04-12 12:44:34

标签: c++ templates const extern linkage

我在自己的.h和.cpp文件中定义了一些静态函数,因此可以从其他地方调用这些函数而无需实例化:

functions.h

#pragma once
class functions {
public:
    static const int addition(const int&, const int&);
    static const int product(const int&, const int&);
};

functions.cpp

#include "functions.h"
const int functions::addition(const int& op1, const int& op2) {
    return op1 + op2;
}
const int functions::product(const int& op1, const int& op2) {
    return op1 * op2;
}

我还为程序设置创建了一个部分,我将在其中定义要选择的函数:

constants.h

#pragma once
const int modulus = 10;
extern const int(*operation)(const int&, const int&);

constants.cpp

#include "constants.h"
#include "functions.h"
const int(*operation)(const int&, const int&) = &functions::addition;

此代码使用以下示例按预期工作:

的main.cpp

#include <iostream>
#include "constants.h"
int main() {
    int a = 7, b = 4;
    std::cout << operation(a,b) % modulus << std::endl;
}

问题是,现在我想使用非类型模板参数化函数添加和产品,例如:

functions.h

#pragma once
class functions {
public:
    template<const int&> static const int addition(const int&, const int&);
};

functions.cpp

#include "functions.h"
template<const int& sub> const int functions::addition(const int& op1, const int& op2) {
    return op1 + op2 - sub;
}

后来的代码中断,无论我如何尝试调整其他文件。我做了我合理(毫无意义)可以想象的一切。

有关如何重写常量代码的任何帮助。*将非常感激。

2 个答案:

答案 0 :(得分:0)

模板在编译时被实例化,为此必须知道定义 - 您需要在标题中定义模板。

即使您这样做,也没有int作为参数,而是const int&
这意味着你需要用一个左值来实例化它,它的身份(即位置)可以在编译时确定。
反过来,这意味着参数必须是具有外部链接的变量 - 不是临时变量或局部变量。

换句话说:

extern int x;

void foo()
{
    addition<1>(2,3); // Not good; not an lvalue
    const int y = 1;
    addition<y>(2,3); // Not good; no linkage
    addition<x>(2,3); // Good
}

您可能希望改为使用template<int sub>

(另一方面注意:对原始类型的const引用毫无意义。他们所做的只是增加开销。)

答案 1 :(得分:0)

模板定义应该在实例化期间对编译器可见,或者显式实例化。由于我非常怀疑您可以显式实例化所有可能的整数模板版本,因此您已将defginitons放入标题中。

问题是operations。由于它是一个函数指针,它只能指向模板的特定实例 - 用特定整数模板实例化的实例。怀疑它是否可用。

我建议重新考虑你的设计。