编译器看不到函数,但可以看到以相同方式使用的所有其他函数

Compiler doesn't see function, thougth all other functions, used in the same way, are seen

我有三个文件:matrix.cpp main.cpp matrix.hpp。 在 matrix.hpp 中声明了一个函数 str_matrix(const char*),它的文本在 matrix.cpp 中。在 main.cpp 我想使用这个功能。 在 matrix.hpp:

class matrix {
...
  friend matrix str_matrix(const char*);

在matrix.cpp中:

#include "matrix.hpp"
#include <iostream>
#include <cstdlib>
#include <cstdio>
...
matrix str_matrix(const char* a) {
...}

在main.cpp中:

#include <iostream>
#include <fstream>
#include "matrix.hpp"
#include <cstdlib>
#include <cstdio>
...
matrix m1(str_matrix ("{1}"));

但是我有一个错误:

nirvana@lpt00:~/cpp/matrix$ g++ main.cpp matrix.cpp 
main.cpp: In function ‘int main()’:
main.cpp:12:30: error: ‘str_matrix’ was not declared in this scope
   matrix m1(str_matrix ("{1}")); 
                              ^

我应该如何处理它?

我假设您遇到的问题与这个较小的示例中的问题相同:

class matrix {
public:
    friend matrix str_matrix(const char*);
};

matrix m1(str_matrix ("{1}"));
// error: 'str_matrix' was not declared in this scope

这里的问题是 friend 声明不会使声明的名称可用于在封闭范围内查找。该名称仅可用于 argument-dependent 查找,但 ADL 未在此处找到该函数,因为参数的类型为 char *,而不是 matrix.

要解决此问题,您还需要包含一个 non-friend 声明,例如:

matrix str_matrix(const char *);

在 header 中的 class 定义之后。

除了 使用当前的 c++ 标准之外,您还可以内联 friend 函数定义:

class matrix {
...
  friend matrix str_matrix(const char*) {
     // Provide the friend unction definition here 
  }
};